Django模板ifequal标签

时间:2010-01-20 04:36:38

标签: python django django-templates

我在循环中的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 %}

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]

记录值:

1

2 个答案:

答案 0 :(得分:5)

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

可能 id 是一个字符串而 city.id 是一个整数吗?

答案 1 :(得分:1)

如果pflags或mflags非空,那么您发布的代码将进入无限循环。

考虑例如代码中的这段代码:

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

就是这样 - 循环结束 - 没有递增i。除非len(pflags)0

,否则这是一个无限循环

因此,您发布的代码与您正在使用的代码不同(在这种情况下,您希望获得帮助非常特别;-),或者这两者确实都是空的,因此模板中的内部循环执行每次0次。

我怀疑第二种可能性获得,但当然我看不到那些xxxFlags值来证实我的怀疑(你可以,并且应该:记录他们,为了Pete的缘故! - )。 / p>