2010-01-20 6 views
4

J'utilise une balise ifequal dans mon template django à l'intérieur d'une boucle où au moins l'un des éléments devrait être égal à l'autre à un certain point de la boucle mais pour une raison inconnue. Je me demandais s'il y avait des cas bizarres que je devrais connaître.Modèle Django ifequal tag

J'ai une liste d'ID de ville int qui devrait être cochée comme cases à cocher. Alors que je boucle à travers toutes les villes, pour chacun d'eux je passe en boucle ceux qui sont censés être vérifiés pour voir si l'égalité n'importe où dans la liste. Mais pour une raison quelconque, aucun d'entre eux ne correspond jamais. J'ai vérifié que les données sont correctes en utilisant le shell django, donc je sais que c'est là, je pense qu'il me manque un petit détail avec la façon dont je l'utilise. Heres le code:

Vue:

def editprof(request): 
    try: 
     if request.session['id']: 
      loggedin = True 
    except KeyError: 
     loggedin = False 
    try: 
     citylist = CityList.objects.all() 
     userid = request.session['id'] 
     user = MemberProfile.objects.get(pk=userid) 
     p = decrypt_pwd(user.Password) 
     pflags = user.PublicVisibleFlags 
     log_val(pflags[0]) 
     pflags = pflags.split(',') 
     mflags = user.MemberVisibleFlags 
     log_val(mflags[0]) 
     mflags = mflags.split(',') 
     return render_to_response('editprof.html', {'user':user, 'p':p, 'loggedin':loggedin, 'citylist':citylist, 'pflags':pflags, 'mflags':mflags}) 
    except KeyError: 
     return HttpResponse('You must be logged in to view this page!') 
    except MemberProfile.DoesNotExist: 
     return HttpResponse('DatabaseError') 

clip Modèle:

{% for city in citylist %} 
<tr> 
    <td><input type='checkbox' name='public' value='{{ city.id }}' {% for id in pflags %}{% ifequal id city.id %}checked{% endifequal %}{% endfor %} /></td> 
    <td><input type='checkbox' name='private' value='{{ city.id }}' {% for id in mflags %}{% ifequal id city.id %}checked{% endifequal %}{% endfor %} /></td> 
    <td>{{ city.CityName }}</td> 
</tr> 
{% endfor %} 

MemberProfile Modèle:

class MemberProfile(models.Model): 
    Username = models.CharField(max_length=12,unique=True) 
    Password = models.CharField(max_length=12) 
    SecurityLevel = models.IntegerField() 
    AccountExpirationDate = models.DateField() 
    CityList = models.TextField() 
    Address1 = models.CharField(max_length=30) 
    Address2 = models.CharField(max_length=30) 
    City = models.CharField(max_length=20) 
    State = models.CharField(max_length=2) 
    Zip = models.CharField(max_length=10) 
    Email = models.EmailField() 
    AltEmail = models.EmailField() 
    HomePhone = models.CharField(max_length=18) 
    BusinessPhone = models.CharField(max_length=18) 
    Fax = models.CharField(max_length=18) 
    Cell = models.CharField(max_length=18) 
    AltPhone = models.CharField(max_length=18) 
    PublicVisibleFlags = models.TextField() 
    MemberVisibleFlags = models.TextField() 
    WhoAmI = models.TextField() 
    CompanyName = models.CharField(max_length=30) 
    ServicesOffered = models.TextField() 
    NumberOfUnits = models.IntegerField() 
    SCREIAOffice = models.CharField(max_length=10) 
    LastModifyBy = models.CharField(max_length=12) 
    LastModifyDate = models.DateField(auto_now=True) 

    def __unicode__(self): 
     return self.Username 

test Console:

>>> from screia.core.models import MemberProfile 
>>> user = MemberProfile.objects.get(pk=1) 
>>> pflags = user.PublicVisibleFlags.split(',') 
>>> print pflags 
[u'1', u'4', u'7', u'12', u'25'] 
>>> i = 0 
>>> while i < len(pflags): 
... pflags[i] = int(pflags[i]) 
... i+=1 
... 
>>> print pflags 
[1, 4, 7, 12, 25] 

Log Valeur:

1 
+0

Pouvez-vous publier votre modèle MemberProfile? – czarchaic

+0

Ok, je l'ai posté. –

Répondre

1

Le code que vous avez posté entrerait dans des boucles infinies si l'une ou pflags Mflags étaient non vide.

Considérons par ex. cet extrait de votre code:

i = 0 
    while i < len(pflags): 
    pflags[i] = int(pflags[i]) 

qui est elle - fin de la boucle - pas incrémentation i que ce soit. Ceci est une boucle infinie sauf si len(pflags) est 0! Par conséquent, soit vous avez posté un code différent de celui que vous utilisez (dans ce cas, il est assez étrange que vous attendiez de l'aide ;-), ou les deux sont en effet vides et donc les boucles internes du modèle exécuter 0 fois chacun.

Je soupçonne que la deuxième possibilité obtient, mais bien sûr, je ne peux pas voir ces valeurs xxxFlags pour confirmer mes soupçons (vous pouvez, et devrait: journal eux, pour l'amour de Pete -).

+0

Hrm, bon point. Eh bien, j'ai changé ça. Je sais que c'est obtenir l'information quelque part parce qu'elle remplit le reste du formulaire. Pour une raison ou une autre, pflags et mflags semblent être vides et je ne sais pas pourquoi. Cependant, je suis allé à la coquille et a couru la même requête et a fait u.PublicVisibleFlags et il a imprimé la liste ... donc je ne sais pas vraiment où les données se perdent –

+0

Si vous regardez à nouveau mon poste, j'ai ajouté un test de shell que j'ai fait qui prouve que pflags et mflags ne devraient pas être vides. J'ai utilisé le même code dans la coquille et les résultats sont apparus. Pour une raison quelconque, cela ne fonctionne pas. Pas certain. –

+0

Je ne vois pas l'appel de journalisation pour montrer leurs valeurs dans l'exécution réelle et le résultat de cet appel de journalisation - pourquoi ne faites-vous pas cela, comme je l'ai suggéré depuis le début? –

5
{% for id in pflags %}{% ifequal id city.id %} ... {% endfor %} 

pourrait-il que id est une chaîne et city.id est un entier?

+0

Ou l'un est une chaîne et l'autre est unicode - cela a causé une frustration pour moi dans le passé. – ashchristopher

+0

Bon point! Certainement un piège à signaler. – Dan