好的,所以我有一个Item类,通过'Roles'类对User提供了多对多属性。我正在尝试为Items创建一个django-table,以便在附加到该项的任何角色中,如果当前User附加到该角色,则显示角色的名称。我希望这有点道理。这是我到目前为止所做的,我并不期望这样做,因为我没有看到Table类如何知道请求/用户。我被卡住了。
models.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)
tables.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')
答案 0 :(得分:2)
您可以从request
获取self.context
对象。因此,如果您只需要request.user
,那就是一种方法。
class OwnedTable(tables.Table):
roles = tables.Column(empty_values=())
def render_roles(self):
user = self.context["request"].user
...
否则,@ mariodev的解决方案有效。
答案 1 :(得分:1)
似乎没有办法在没有重写的情况下使用auth用户。
您可以为我们的表类覆盖__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
来引用当前登录的用户。
答案 2 :(得分:0)
https://github.com/bradleyayers/django-tables2/issues/156上显示了另一种解决方案,经过对我的设置进行一些调整后,这对我有用。
鉴于一个人有一个M2M到联系人,并且你想在django-tables2中显示该人的所有联系人,那么下面会这样做:
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
获取所需内容。