2017-11-28 3 views
0

Ich habe eine Django-Vorlage, die ich zum Filtern von Objekten in einer Abfrage verwenden möchte. Ich habe eine Gruppe, der ich neue Mitglieder hinzufügen möchte. Ich habe eine Liste von Mitgliedsobjekten, die verwendet werden, um die Gruppenmitglieder zu verfolgen, die hinzugefügt wurden, als die Gruppe erstellt wurde. Die Mitglieder wurden hinzugefügt, indem eine Liste der Benutzer mit einem Kontrollkästchen neben ihren Namen angezeigt wurde. Ich möchte jetzt eine Liste von Freunden anzeigen, die noch nicht Mitglieder der Gruppe sind, und sie dann zur Gruppe hinzufügen, wenn sie ausgewählt sind. Ich bekomme ein Problem mit dem HTML-Template-Filtersystem, das ich erstellt habe, um nur die Liste der Freunde anzuzeigen, die noch keine Mitglieder sind ... kann mir jemand helfen, dies herauszufinden. Ich habe alle den Code unten:Filterproblem mit einer Django-Vorlage mit zwei Querysets - django

hier ist die Abfragen, die übergeben wurden:

# grab the group members 
members = Member.objects.filter(group = group).all() 
# grab all of the friends fo the logged in user 
friender = Friend.objects.filter(user = user.username).all() 
friended = Friend.objects.filter(friend = user).all() 
friends = friender | friended 
# the required parameters for this form 
parameters = { 
    'friends':friends, 
    'members':members, 
    'group':group, 
    'message':message, 
} 
return render(request, 'groups/add_members.html', parameters) 

Hier wird die HTML-Vorlage:

{% extends "general/header.html" %} 

{% block content %} 
    <h1>Create Group</h1> 
    <p>{{ message }}</p> 
    <form method="POST"> 
     {% csrf_token %} 
     {% for friend in friends %} 
      {% for member in members %} 
      {% if member.user.username != friend.friend.username %} 
       {% if member.user.username != friend.user %} 
       {% if friend.user == user.username %} 
        <p> 
        {{ friend.friend.username }} 
        <input type="checkbox" name="{{friend.friend.username}}" value="{{friend.friend.username}}"> 
        </p> 
       {% endif %} 
       {% if friend.friend == user %} 
        <p> 
        {{ friend.user }} 
        <input type="checkbox" name="{{friend.user}}" value="{{friend.user}}"> 
        </p> 
       {% endif %} 
       {% endif %} 
      {% endif %} 
      {% endfor %} 
     {% endfor %} 
     <input type="submit" name="submit" value="submit"> 
    </form> 

{% endblock %} 

Hier ist die Liste der Freunde und Mitglieder, die es gibt jetzt

logged in user omar 
friends: hani, assad, rana, amer 
members: hani, assad 

hier ist das, was die Anzeige ist:

enter image description here

Hier sind die Modelle:

# the following are models for accepted friend requests 
class Friend(models.Model): 
    user = models.CharField(max_length=22, default='current user') 
    friend = models.ForeignKey(User, on_delete=models.CASCADE, default=1) 
    created = models.DateTimeField(auto_now_add=True) 

class UserActivity(models.Model): 
    user = models.ForeignKey(User, on_delete=models.CASCADE) 
    account = models.CharField(max_length=150, null=True) 
    expense = models.ForeignKey(Expense, null=True, on_delete=models.CASCADE) 
    request = models.ForeignKey(Request, null=True, on_delete=models.CASCADE) 
    description = models.CharField(max_length=200, default='some action') 
    reference = models.IntegerField(default = '101', null = True) 
    category = models.IntegerField(default=1) 
    status = models.SmallIntegerField(default=1) 
    # 1 = unseen 
    # 2 = seen 
    created = models.DateTimeField(auto_now_add=True) 
# Member stores all of the different members to each of the created groups 
class Member(models.Model): 
    user = models.ForeignKey(User, default=1, on_delete=models.CASCADE) 
    group = models.ForeignKey(Group, default=1 , on_delete=models.CASCADE) 
    status = models.SmallIntegerField(default=1) 
    # 1 = member 
    # 2 - host 
    created = models.DateTimeField(auto_now_add=True) 
+0

Bitte fügen Sie Ihre Modelle hinzu. –

Antwort

1

Es ist schwierig, ohne Modelle zu debuggen, aber Sie könnten Ihren Code wie folgt vereinfachen:

  1. erstellen Liste der Mitglieder:

    members = [member.user.username for member in Member.objects.filter(group = group)] 
    
  2. Ändern Sie die HTML-Vorlage in diese. Sie prüfen, ob friend nicht in der Liste members ist und wenn True Sie ihn an:

    {% extends "general/header.html" %} 
    {% block content %} 
        <h1>Create Group</h1> 
        <p>{{ message }}</p> 
        <form method="POST"> 
        {% csrf_token %} 
        {% for friend in friends %} 
         {% if friend.friend.username not in members %} 
         <p> 
          {{ friend.friend.username }} 
          <input type="checkbox" name="{{friend.friend.username}}" value="{{ friend.friend.username }}"> 
         </p> 
         {% endif %} 
         {% if friend.user not in members %} 
         <p> 
          {{ friend.user }} 
          <input type="checkbox" name="{{friend.user}}" value="{{ friend.user }}"> 
         </p> 
         {% endif %} 
        {% endfor %} 
        <input type="submit" name="submit" value="submit"> 
        </form> 
    {% endblock %} 
    

Diese können nur Benutzer angezeigt, die derzeit nicht Mitglieder der Gruppe.

Sonstige Bemerkungen:

  • Es besteht keine Notwendigkeit .all() nach Filter zu verwenden. Sie filtern bereits, was definitionsgemäß nicht alles ist.
  • Versuchen Sie, möglichst verschachtelte Schleifen und verschachtelte Wenns zu vermeiden. Manchmal kann man sie nicht vermeiden.
+0

Ich versuchte zu vermeiden, zu verschachteln, aber ich konnte gestern keine Lösung finden. Ich werde deine Lösung versuchen und sehen, ob das funktioniert. Es sieht so aus, als würde es funktionieren. –

+0

es hat funktioniert, danke ... –

Verwandte Themen