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

时间:2013-10-24 19:13:46

标签: python django django-tables2

好的,所以我有一个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')

3 个答案:

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