Django шаблон ifequal тег - PullRequest
       8

Django шаблон ifequal тег

4 голосов
/ 20 января 2010

Я использую тег ifequal в своем шаблоне django внутри цикла, где хотя бы один из элементов должен совпадать с другим в некоторой точке цикла, но по какой-то причине он никогда не отображает то, что должен. Мне было интересно, есть ли какие-нибудь странные случаи, о которых я должен знать.

У меня есть список внутренних идентификаторов городов, которые должны быть отмечены флажками. так как я перебираю все города, для каждого из них я перебираю те, которые должны быть проверены, чтобы увидеть, равно ли они где-либо в списке. Но по какой-то причине никто из них никогда не совпадал. Я проверил, что данные верны, используя оболочку django, поэтому я знаю, что она там, я думаю, что мне не хватает какой-то небольшой детали о том, как я ее использую. Вот код:

Вид:

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 ]

5 голосов
/ 21 января 2010
{% for id in pflags %}{% ifequal id city.id %} ... {% endfor %}

Может быть, id - это строка, а city.id - это целое число?

1 голос
/ 20 января 2010

Код, который вы разместили, попадал бы в бесконечные циклы, если бы pflags или mflags были непустыми.

Рассмотрим, например, этот фрагмент из вашего кода:

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

вот оно -- конец цикла - нет увеличение i вообще.Это бесконечный цикл, если len(pflags) не равен 0!

Следовательно, либо вы разместили код, отличный от того, что вы используете (в этом случае довольно странно ожидать помощи ;-)или оба из них действительно пусты, и поэтому внутренние циклы в шаблоне выполняются по 0 раз каждый.

Я подозреваю, что появляется вторая возможность, но, конечно, я не вижу этих значений xxxFlags, чтобы подтвердить мое подозрение (Вы можете и должны: войти их, ради Пита! -).

...