Python 在django-Table2中从多到多显示相关记录
好的,我有一个Item类,它通过一个“Roles”类对用户具有多对多属性。我正在尝试为项目创建django表,以便在附加到项目的任何角色中,如果当前用户附加到该角色,则显示该角色的名称。我希望这有点道理。这是我到目前为止所做的,我真的不希望这样做,因为我不知道Table类如何知道请求/用户。我卡住了 models.pyPython 在django-Table2中从多到多显示相关记录,python,django,django-tables2,Python,Django,Django Tables2,好的,我有一个Item类,它通过一个“Roles”类对用户具有多对多属性。我正在尝试为项目创建django表,以便在附加到项目的任何角色中,如果当前用户附加到该角色,则显示该角色的名称。我希望这有点道理。这是我到目前为止所做的,我真的不希望这样做,因为我不知道Table类如何知道请求/用户。我卡住了 models.py class Item(models.Model): name = models.CharField(max_length=255) owner = mo
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')
似乎在没有覆盖的情况下,无法使用auth user 您可以为我们的表类重写
\uuuu init\uuu
,如下所示:
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\u roles
方法引用当前登录的用户。您可以从self.context
获取请求
对象。因此,如果您只需要request.user
,这是一种方法
class OwnedTable(tables.Table):
roles = tables.Column(empty_values=())
def render_roles(self):
user = self.context["request"].user
...
否则,@mariodev的解决方案会起作用 上显示了另一个解决方案,在对设置进行了一些调整后,它对我有效 假设一个人有一个M2M to联系人,并且您希望在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)
类PersonTable(tables.Table):
person\u contacts=tables.Column(accessor=“contacts”,verbose\u name=“contacts”)
def render_person_联系人(自身、值、表):
clist=“”
cfirst=True
conts=list(value.all())
对于c(续):
如果不是cfirst:
clist+=“
”
其他:
cfirst=False
打印身份证
uri=reverse('cont_detail',kwargs={'pk':c.id})
clist+=''+'('+c.relation+')'
安全返回标记(clist)
基本上,您可以添加一个名称不存在的列,将访问器设置为M2M字段名,然后调用render\uu
,从value
获取所需内容