【问题标题】:Bad for-loop in django with Groups model, ManyToMany field带有组模型,ManyToMany 字段的 django 中的错误 for 循环
【发布时间】:2016-03-20 22:03:46
【问题描述】:

我想在 for 循环中显示 1 个按钮,但我得到的按钮与我创建的组一样多。所以.. 当我创建 3 个组时,我是其中的成员之一,我在每个组下都有 3 个按钮。问题在于我的代码中的第一个循环,但我不知道如何解决。

问题在循环中:

{% for z in mem %}

当我创建任何会员时,就像:

m = Membership.objects.create(person="damian", group="name_group", leader=True)  / or False

感谢您的帮助!

groups.html:

{% for g in gr %}
           <div class="jumbotron">
            <div class="jumbo2">
              <form method="POST" class="post-form"> {% csrf_token %}
                <p id="name"><b>Group's name:</b> {{g.name}}</p><br>

                {% for member in g.members.all %}

                  <p><b>Member:</b> {{member.name}} </p>

                {% endfor %}



                <br>
                <span class="desc2">Group's description:</span>
                <p id="desc">{{g.description}}</p><br>
                {% for z in mem %}
                  {% if z.leader == False %}
                    <button style="float: right" type="submit" name = "leave"  value = "{{g.name}}" class="save btn btn-default">Leave</button>
                  {% elif z.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>
              {% if messages %}
                {% for message in messages %}
                  <p>{{ message }}</p>
                {% endfor %}
              {% endif %}
              </p>

            </div>
          </div>



          {% endfor %}

views.py:

    cvs = Cv.objects.all()
    cv = Cv.objects.filter(author = request.user)
    per = Person.objects.all()
    gr = Group.objects.filter(members__name=request.user)
    perr = Person.objects.filter(name=request.user)

    mem = Membership.objects.filter(group = gr, person = perr)
    form = GroupForm()


    context = {
        'gr': gr,
        'per':per,
        'mem':mem,
        'form': form,
        'cvs':cvs,
        'cv':cv,
    }

    return render(request, 'groups.html', context)

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)

【问题讨论】:

  • 为什么你还坚持使用不可读的两个字符的变量名?如果变量代表组,则称它为groups,而不是gr。我们不是生活在 80 年代,计算机有足够的内存来存储全字变量名。
  • 好的,很抱歉,但这是我的第一个应用程序,所以我想自己做。但我会为未来纠正自己。无论如何,你知道如何解决这个问题吗?
  • 老实说,我什至不明白问题出在哪里。您想看什么,目前看什么?
  • 我想看到 1 个按钮,这将是代码中的两个按钮之一:“离开”或“删除”。如果条件有效,但所有这些都在主 for 循环中,而不是 1 个按钮,例如,如果我的模板中显示了 3 个组,我得到了 3 个按钮。 django 中是否有类似“break” for 循环的东西?
  • 如果您只想处理第一组,为什么要将它们全部传递给模板?只需使用'gr': gr[:1]

标签: python django for-loop many-to-many manytomanyfield


【解决方案1】:

好的,我替换了我的组并仅使用了会员对象。这是我的工作代码:

          {% for z in mem %}
           <div class="jumbotron">
            <div class="jumbo2">
              <form method="POST" class="post-form"> {% csrf_token %}
                <p id="name"><b>Group's name:</b> {{z.group}}</p><br>

                {% for member in z.group.members.all %}

                  <p><b>Member:</b> {{member.name}} </p>

                {% endfor %}


                <br>
                <span class="desc2">Group's description:</span>
                <p id="desc">{{z.group.description}}</p><br>


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

              </form>
              <br><br>
              <p>
              </p>

            </div>
          </div> 

          {% endfor %}

【讨论】:

    猜你喜欢
    • 2020-05-07
    • 2012-09-26
    • 2020-02-18
    • 1970-01-01
    • 2021-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-15
    相关资源
    最近更新 更多