Django模板ifequal标签
Posted
技术标签:
【中文标题】Django模板ifequal标签【英文标题】:Django template ifequal tag 【发布时间】:2011-01-07 03:07:14 【问题描述】:我在循环内的 django 模板中使用 ifequal 标记,其中至少一个项目应该在循环中的某个点等于另一个,但由于某种原因它永远不会显示它应该显示的内容。我想知道是否有任何我应该知道的奇怪案例。
我有一个 int 城市 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 %
会员资料模型:
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]
日志值:
1
【问题讨论】:
您可以发布您的 MemberProfile 模型吗? 【参考方案1】:如果 pflags 或 mflags 不为空,您发布的代码将进入无限循环。
考虑例如您的代码中的这个 sn-p:
i = 0
while i < len(pflags):
pflags[i] = int(pflags[i])
就是这样——循环结束——否递增i
。这是一个无限循环,除非len(pflags)
是0
!
因此,要么您发布的代码与您正在使用的代码不同(在这种情况下,您期望得到帮助是很奇怪的;-),或者这两个确实是空的,因此模板中的内部循环执行每次 0 次。
我怀疑第二种可能性,但当然我看不到那些 xxxFlags 值来证实我的怀疑(你可以而且应该:记录它们,看在 Pete 的份上!-)。
【讨论】:
嗯,好点。好吧,我改变了这一点。我知道它在某处获取信息,因为它填写了表格的其余部分。由于某种原因 pflags 和 mflags 似乎是空的,我不知道为什么。但是我去了 shell 并运行了相同的查询并执行了 u.PublicVisibleFlags 并打印了列表......所以我不确定数据在哪里丢失 如果你再看我的帖子,我添加了一个我做过的 shell 测试,证明 pflags 和 mflags 不应该为空。我在 shell 中使用了相同的代码,结果出现了。出于某种原因,它虽然不起作用。不确定。 我没有看到日志调用来显示它们在实际运行中的值以及日志调用的结果——你为什么不这样做,就像我从一开始就建议的那样?跨度> 好的,我尝试了日志记录。它将第一个值写入文件,它现在应该有一个值,但无论出于何种原因,当我返回该页面时,该复选框仍然没有被选中。【参考方案2】:% for id in pflags %% ifequal id city.id % ... % endfor %
难道id是字符串,city.id是整数?
【讨论】:
或者一个是字符串,另一个是 unicode——这在过去让我很沮丧。以上是关于Django模板ifequal标签的主要内容,如果未能解决你的问题,请参考以下文章