Search code examples
djangodjango-modelsdjango-tables2

django-tables2: use request user in render method


I'm using djnago-tables2 to display data from my event model. I need to get the current request user into the render method of the table (to further call a model function to get the response of the current user).

How can i do this?

My Model

class Event(models.Model):

    name=models.CharField(max_length=254)
    start=models.DateTimeField()
    end=models.DateTimeField()
    invited_user=models.ManyToManyField(User,blank=True)

    def getResponseFromUser(self, user):
        try:
            return Response.objects.filter(event=self, user=user).order_by('-pk')[0]
        except Exception:
            return None

class Response(models.Model):
    user=models.ForeignKey(User)
    event=models.ForeignKey(Event)
    timestamp=models.DateTimeField(auto_now_add=True)

    SEEN=0
    YES=1
    PROBABLY_YES=2
    PROBABLY_NO=3
    NO=4

    RESPONSE=(
        (SEEN, _('seen but undecided')),
        (YES, _('Yes')),
        (PROBABLY_YES, _('probably yes')),
        (PROBABLY_NO, _('probably no')),
        (NO, _('No')),
    )
    response=models.IntegerField( choices=RESPONSE, default=SEEN)

    @property
    def getResponseText(self):
        return self.RESPONSE[self.response][1]

Table

class EventTable(tables.Table):

    requestUser=None # to be set from request (externally)

    eventResponse = tables.Column(empty_values=(), verbose_name="Response", orderable=False)

    class Meta:
        model = Event
        # add class="paleblue" to <table> tag
        attrs = {"class": "table"}
        exclude=['id', 'user_can_invite', 'description', 'organizer']

    def render_eventResponse(self, record):
        responseObject=record.getResponseFromUser(self.requestUser)
        if not responseObject:
            return ''
        else:
            return responseObject.getResponseText

View

class PersonalEventTableView(SingleTableView):
    model = Event
    table_class = EventTable
    template_name = 'list_events.html'
    paginate_by = 50

in urls.py the view is rendered with PersonalEventTableView.as_view()

Can anyone help ?


Solution

  • Well you can use this plugin here: https://github.com/Alir3z4/django-crequest

    Use it like this:

    def render_eventResponse(self, record):
        from crequest.middleware import CrequestMiddleware
        current_request = CrequestMiddleware.get_request()
        user = current_request.user
        responseObject=record.getResponseFromUser(user)
        if not responseObject:
            return ''
        else:
            return responseObject.getResponseText