如何使用 Django 中的成员资格访问多对多的属性

Posted

技术标签:

【中文标题】如何使用 Django 中的成员资格访问多对多的属性【英文标题】:How do i access the properties of a many-to-many with Membership in Django 【发布时间】:2016-07-09 18:10:28 【问题描述】:

我怎样才能只设置我的会员资格,而不是全部在 for-loop 中?

模板.html

         % for g in gr %

           <div class="jumbotron">
            <div class="jumbo2">
              <form method="POST" class="post-form"> % csrf_token %
                <p id="name"><b>Groups name:</b> g.name</p><br>

                % for membership in g.membership_set.all %

                      <p><b>Member:</b>  membership.person  -  membership.role </p>                            

                % endfor %






                <br>
                <span class="desc2">Groups description:</span>
                <p id="desc">g.description</p><br>



                % for membership in g.membership_set.all %

                      % if membership.leader == False %
                        <button style="float: right" type="submit" name = "leave"  value = "g.name" class="save btn btn-default">Leave</button>
                      % elif membership.leader == True %
                        <button style="float: right" type="submit" name = "delete"  value = "g.name" class="save btn btn-default">Delete</button>
                      % endif %

                 % endfor %
              </form>
              <br><br>
              <p></p>



                </div>
                </div>

            % endfor %

models.py:

class Person(models.Model):
    name = models.CharField(max_length=128)

    def __str__(self):              # __unicode__ on Python 2
        return self.name


class Group(models.Model):
    name = models.CharField(max_length=128)
    members = models.ManyToManyField(Person, through='Membership')
    description = models.TextField(max_length=350)

    def __str__(self):              # __unicode__ on Python 2
        return self.name


class Membership(models.Model):
    person = models.ForeignKey(Person)
    leader = models.BooleanField(default=False)
    group = models.ForeignKey(Group)
    role = models.CharField(max_length=50)

我的按钮与某个组中的用户一样多。 我只想显示 1 个按钮,并且我只需要为我在该组中的成员身份精确 ForLoop。我该怎么做?

【问题讨论】:

“我的会员资格”是什么意思?这完全不清楚。你也可以发布你的模型吗? 我的意思是,循环 % for members in g.membership_set.all % 正在遍历某个组中的所有成员。这就是为什么当我想检查我的成员资格(我在这个组中的人)的领导者字段是否为真或假时,但是我现在拥有的这个循环正在遍历这个组中的所有成员(所有成员资格)。好的,我更改并添加模型 【参考方案1】:

我认为您不能仅通过使用标准模板代码来做到这一点。您需要通过像这样过滤成员资格来获取您的 Membership 对象:

membership = my_person.membership_set.get(group=my_group)

要在模板中执行此操作,您必须编写适用于my_person 对象的own template filter,并将my_group 对象作为参数。然后过滤器可以应用上述查询并返回成员资格对象。

% with membership=my_person|get_group_membership:g %
    % if membership.leader == False %
        <button style="float: right" type="submit" name = "leave"  value = "g.name" class="save btn btn-default">Leave</button>
    % elif membership.leader == True %
        <button style="float: right" type="submit" name = "delete"  value = "g.name" class="save btn btn-default">Delete</button>
    % endif %
% endwith %

【讨论】:

以上是关于如何使用 Django 中的成员资格访问多对多的属性的主要内容,如果未能解决你的问题,请参考以下文章

如何过滤和访问 Django QuerySet 中的多对多字段?

Django

DJANGO:在模板中显示多对多的附加字段

Django多对多的增删改查

Django中的多对多查找

Django:通过另一个多对多关系访问多对多对象