Python 在django-Table2中从多到多显示相关记录

Python 在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

好的,我有一个Item类,它通过一个“Roles”类对用户具有多对多属性。我正在尝试为项目创建django表,以便在附加到项目的任何角色中,如果当前用户附加到该角色,则显示该角色的名称。我希望这有点道理。这是我到目前为止所做的,我真的不希望这样做,因为我不知道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')

似乎在没有覆盖的情况下,无法使用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
获取所需内容