2010-01-20 70 views
4

我在循環內我的django模板中使用ifequal標記,其中至少有一個項目應該等於另一個循環中的某個點,但由於某種原因,它永遠不會顯示它應該。我想知道是否有任何我應該知道的奇怪的情況。Django模板ifequal標記

我有一個int city ID的列表,應該選中複選框。所以當我循環遍歷所有的城市時,對於每一個城市,我循環遍歷那些應該檢查的城市,看看列表中的任何地方是否平等。但無論出於何種原因,他們都不符合。我使用django shell驗證了數據是正確的,所以我知道它在那裏,我想我錯過了我如何使用它的一些小細節。繼承人的代碼:

查看:

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') 

模板夾:

{% 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型號:

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 

控制檯測試:

>>> 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值:

1 
+0

你可以發佈你的MemberProfile模型嗎? – czarchaic 2010-01-20 05:18:23

+0

好的,我發佈了它。 – 2010-01-20 05:35:27

回答

1

您已經發布將進入無限循環如果任pflags或mflags是非空的代碼。

考慮例如這個片段從您的代碼:

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

就是它 - 環的末端 - 沒有遞增的i任何責任。這是一個無限循環,除非len(pflags)0

因此,無論您是否發佈了與您正在使用的代碼不同的代碼(在這種情況下,您希望得到幫助是相當奇特的;-),或者這兩者確實是空的,因此模板中的內部循環每個執行0次。

我懷疑第二種可能性,但我當然無法看到這些xxxFlags值來證實我的懷疑(你可以,應該:日誌他們,爲皮特的緣故!)。

+0

Hrm,好點。那麼我改變了。我知道它獲取信息的地方,因爲它填補了表格的其餘部分。出於某種原因,pflags和mflags似乎是空的,我不知道爲什麼。然而,我去了殼,並運行相同的查詢,並做了u.PublicVisibleFlags,它打印出列表...所以我不確定數據丟失的位置 – 2010-01-20 04:53:35

+0

如果你再看看我的帖子,我添加了一個shell測試,我做了這證明pflags和mflags不應該是空的。我在shell中使用了相同的代碼,結果出來了。由於某種原因,它不工作。不確定。 – 2010-01-20 22:40:04

+0

我沒有看到日誌記錄調用在實際運行中顯示它們的值以及該日誌記錄調用的結果 - 爲什麼不按照我的建議從頭開始呢? – 2010-01-20 23:43:44

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

難道ID是一個字符串,city.id是一個整數?

+0

或者一個是字符串,另一個是unicode - 這在過去給我造成了挫折。 – ashchristopher 2010-01-21 19:56:55

+0

好點!絕對是一個值得指出的陷阱。 – Dan 2010-01-22 14:05:33