django-tables2:在渲染方法中使用请求用户
django-tables2: use request user in render method
我正在使用 djnago-tables2 来显示来自我的事件模型的数据。我需要让当前请求用户进入 table 的渲染方法(进一步调用模型函数来获取当前用户的响应)。
我该怎么做?
我的模型
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
查看
class PersonalEventTableView(SingleTableView):
model = Event
table_class = EventTable
template_name = 'list_events.html'
paginate_by = 50
在 urls.py 中,视图使用 PersonalEventTableView.as_view()
呈现
有人能帮忙吗?
你可以在这里使用这个插件:https://github.com/Alir3z4/django-crequest
这样使用:
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
您可以非常简单地将请求添加到 table 的上下文中。
class PersonalEventTableView(SingleTableView):
model = Event
table_class = EventTable
template_name = 'list_events.html'
paginate_by = 50
def get_context_data(self, **kwargs):
""" Override SingleTableView class method """
context = super(SingleTableMixin, self).get_context_data(**kwargs)
table = self.get_table(**self.get_table_kwargs())
# add the request directly to your table
table.request = self.request
context[self.get_context_table_name(table)] = table
return context
现在可以在您的 Table class 中使用它。
class 事件Table(tables.Table):
eventResponse = tables.Column(empty_values=(), verbose_name="Response", orderable=False)
class Meta:
model = Event
attrs = {"class": "table"}
exclude=['id', 'user_can_invite', 'description', 'organizer']
def render_eventResponse(self, record):
# self.request.user is available
responseObject=record.getResponseFromUser(self.request.user)
return responseObject.getResponseText if responseObject else ""
我正在使用 djnago-tables2 来显示来自我的事件模型的数据。我需要让当前请求用户进入 table 的渲染方法(进一步调用模型函数来获取当前用户的响应)。
我该怎么做?
我的模型
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
查看
class PersonalEventTableView(SingleTableView):
model = Event
table_class = EventTable
template_name = 'list_events.html'
paginate_by = 50
在 urls.py 中,视图使用 PersonalEventTableView.as_view()
呈现有人能帮忙吗?
你可以在这里使用这个插件:https://github.com/Alir3z4/django-crequest
这样使用:
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
您可以非常简单地将请求添加到 table 的上下文中。
class PersonalEventTableView(SingleTableView):
model = Event
table_class = EventTable
template_name = 'list_events.html'
paginate_by = 50
def get_context_data(self, **kwargs):
""" Override SingleTableView class method """
context = super(SingleTableMixin, self).get_context_data(**kwargs)
table = self.get_table(**self.get_table_kwargs())
# add the request directly to your table
table.request = self.request
context[self.get_context_table_name(table)] = table
return context
现在可以在您的 Table class 中使用它。
class 事件Table(tables.Table):
eventResponse = tables.Column(empty_values=(), verbose_name="Response", orderable=False)
class Meta:
model = Event
attrs = {"class": "table"}
exclude=['id', 'user_can_invite', 'description', 'organizer']
def render_eventResponse(self, record):
# self.request.user is available
responseObject=record.getResponseFromUser(self.request.user)
return responseObject.getResponseText if responseObject else ""