模型.py
class Item(models.Model):
name = models.CharField(max_length=255)
owner = models.ForeignKey(User, related_name='Owner')
roles = models.ManyToManyField(User, through='Role')
class Role(models.Model):
role_type = models.ForeignKey(RoleType)
user = models.ForeignKey(User)
item = models.ForeignKey(Item)
表.py
class OwnedTable(tables.Table):
roles = tables.Column()
user = request.user
def render_roles(self):
for role in roles:
if role.User == user:
return role.role_type
else:
pass
class Meta:
model = Item
attrs = {"class": "paleblue"}
fields = ('id', 'name', 'owner', 'roles')
request
获取
self.context
对象。因此,如果您只需要
request.user
,这是一种方法。
class OwnedTable(tables.Table):
roles = tables.Column(empty_values=())
def render_roles(self):
user = self.context["request"].user
...
否则,@mariodev 的解决方案有效。
您可以像这样覆盖我们的表类的
__init__
:
class OwnedTable(tables.Table):
def __init__(self, *args, **kwargs):
self.user = kwargs.pop('user', None)
super(OwnedTable, self).__init__(*args, **kwargs)
然后,在内部视图中,您可以使用
user
参数调用表,就像这样
table = OwnedTable(Person.objects.all(), user=request.user)
现在您可以在
self.user
方法中使用
render_roles
来引用当前登录的用户。
https://github.com/bradleyayers/django-tables2/issues/156,在对我的设置进行一些调整后,它对我有用。
假设一个人有一个 M2M 到联系人,并且您想在 django-tables2 中显示该人的所有联系人,那么可以执行以下操作:
from django.utils.safestring import mark_safe
class PersonTable(tables.Table):
person_contacts = tables.Column(accessor="contacts", verbose_name="Contacts")
def render_person_contacts(self, value, table):
clist = ""
cfirst = True
conts = list(value.all())
for c in conts:
if not cfirst:
clist += "<br />"
else:
cfirst = False
print c.id
uri = reverse('cont_detail', kwargs={'pk': c.id})
clist += '<a href="' + uri + '">' + c.name + '</a>' + ' (' + c.relation + ')'
return mark_safe(clist)
您基本上添加一个名称不存在的列,将访问器设置为 M2M 字段名称,然后调用 render_<newly_added_column>
,从
value
获取所需内容。