1

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

3 回答 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 的解决方案有效。

于 2013-10-25T02:57:26.237 回答
1

似乎没有一些覆盖就无法使用 auth 用户。

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

class OwnedTable(tables.Table):
    def __init__(self, *args, **kwargs):
        self.user = kwargs.pop('user', None)
        super(OwnedTable, self).__init__(*args, **kwargs)

然后,在视图内部,您使用参数调用 table user,就像这样

table = OwnedTable(Person.objects.all(), user=request.user)

现在您可以使用self.userinsiderender_roles方法来引用当前登录的用户。

于 2013-10-24T21:12:20.123 回答
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

于 2014-03-22T14:45:38.663 回答