0

I want to display 1 button in the for-loop, but i get as many buttons as many i have created groups. So.. when i created 3 groups where i'm one of the members, i got 3 buttons under every group i have. The problem is with this first loop in my code, but i don't know how to solve this.

Problem is in loop:

{% for z in mem %}

When i create any memberships it's like:

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

Thanks for any help!

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)
Damian
  • 115
  • 4
  • 13
  • Why do you still insist on using unreadable two-character variable names? If a variable represents groups, call it `groups`, not `gr`. We aren't living in the 80s, computers have sufficient memory for full-word variable names. – Daniel Roseman Mar 20 '16 at 22:25
  • Ok, i'm sorry, but it's my first app so i'm trying to do by myself. But i will correct myself for the future. Anyway, do you know how to sole this problem? – Damian Mar 20 '16 at 22:34
  • Honestly I didn't even understand what is the problem. What do you want to see and what do you currently see? – Selcuk Mar 20 '16 at 22:42
  • I wanna see 1 button, which will be one of two which are in code: "Leave" or "Delete". This if condition is working, but all of this is in the main for-loop, and instead 1 button, i got, for example, 3 buttons, if i have 3 groups displayed in my template. Is there in django something like "break" for loops? – Damian Mar 20 '16 at 22:47
  • If you want to process only the first group, why do you pass all of them to the template? Just use `'gr': gr[:1]` – Selcuk Mar 20 '16 at 23:08
  • Becouse i want to display all groups in different div's in my template. And in every group i displaying members, name o group and description. But if no one help me solve this, i think i will make this other way. Somehow like you want me to do, but then, only 1 will be displayed if I choose her. – Damian Mar 20 '16 at 23:22
  • `forloop.counter` may help, read documentation about it. – Selcuk Mar 20 '16 at 23:28
  • Ok, thank you. I think i know what you mean. I'll try this. – Damian Mar 20 '16 at 23:32
  • Ok, this works, but thakns to this method and you, i know thath the problem is in loop: {% for z in mem %} - in membership loop. But it's nested in oouter loop, and when the outer loop counter = 2, the nexted loop not restrt, but counting further. How can i restart this forloop.counter in this nested loop? – Damian Mar 21 '16 at 17:47

1 Answers1

0

Ok, i replace my groups and used only membership objects. Here's my working code:

          {% 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 %}
Damian
  • 115
  • 4
  • 13