在django-tables2中显示多对多的相关记录

问题描述 投票:0回答:3
好的,所以我有一个 Item 类,它通过“Roles”类具有与 User 的多对多属性。我正在尝试为项目创建一个 django 表,以便在附加到该项目的任何角色中,如果当前用户附加到该角色,则会显示该角色的名称。我希望这是有道理的。这是我到目前为止所做的,我并没有真正期望它能起作用,因为我不知道 Table 类如何了解请求/用户。我被困住了。

模型.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')
    
python django django-tables2
3个回答
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
投票
似乎没有办法在不进行某些覆盖的情况下使用身份验证用户。

您可以像这样覆盖我们的表类的

__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
 来引用当前登录的用户。


1
投票
另一个解决方案显示在

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
 获取所需内容。

© www.soinside.com 2019 - 2024. All rights reserved.