Отображать соответствующие записи от многих ко многим в django-tables2

Итак, у меня есть класс Item, который имеет атрибут «многие ко многим» для пользователя через класс «Роли». Я пытаюсь создать таблицу 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')

person thumbtackthief    schedule 24.10.2013    source источник


Ответы (3)


Вы можете получить объект request у self.context. Так что, если вам нужно только request.user, это один из способов сделать это.

class OwnedTable(tables.Table):
    roles = tables.Column(empty_values=())

    def render_roles(self):
        user = self.context["request"].user
        ...

В противном случае решение @mariodev работает.

person SunnySydeUp    schedule 25.10.2013

Кажется, что нет способа использовать пользователя 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 для ссылки на текущего пользователя, вошедшего в систему.

person mariodev    schedule 24.10.2013

Другое решение показано на 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.

person SaeX    schedule 22.03.2014