2013-07-29 19 views
6
{% set disabled = '' %} 
{% for voter in record.voters %} 
    {% if user == voter %} 
     {% set disabled = 'disabled' %} 
    {% endif %} 
    {{ disabled }} # outputs: 'disabled' 
{% endfor %} 
{{ disabled }} # outputs: '' 

Bu şablonu Jinja2'de var. İhtiyacım olan şey 'devre dışı' değişkeninin 'for' döngüsü dışında görünmesidir. Bu mümkün mü? Varsayılan blokları ileJinja2: yerel/genel değişken

cevap

10

bu işlemek için en kolay yolu taşımaktır Görünüm işlevinize disabled değişkenini ayarlayan ve kullanılmaya hazır şablona gönderen mantık. Uygulama mantığını sunumla karıştırmak iyi bir fikir değildir, şablonlar verileri mümkün olduğunca sindirilmiş olarak almalıdır.

Bunun için, this question'a kabul edilen yanıtta gösterilen, istediğiniz şeyi yapan çirkin bir hack vardır. Çözüm, Jinja2 için do uzantısının etkinleştirilmesini ve genel bir diziyi değiştirmek için kullanılmasını içerir. İşte

app.jinja_env.add_extension('jinja2.ext.do') 

sizin örnek adapte çözümdür: uzatma kullanımını etkinleştirmek için Miguel anlaşılacağı gibi Bir dizi/dicti kullanabilirsiniz

{% set disabled = [] %} 
{% for voter in record.voters %} 
    {% if user == voter %} 
     {% do disabled.append(1) %} 
    {% endif %} 
{% endfor %} 
{% if disabled %} 
    disabled 
{% endif %} 
+0

thx . Kodumu zaten gözden geçirdim ve ilk başta önerdiğini beğendim. –

0

dış kapsamları değişkenlere erişimin olmayabilir, bunu böyle scoped değiştirici kullanarak bu geçersiz kılabilirsiniz:

{% for item in list scoped %} 
{% endfor %} 

Bkz: http://jinja.pocoo.org/docs/templates/#block-nesting-and-scope

+1

Bunu yapmadı! 'Scoped', döngüler için değil –

+0

@ c00p3r.web için bloklar için çalışır. İstenirse işlevsellik gibi görünen jinja2 için bir sorun açılmasını öneririm: https://github.com/mitsuhiko/jinja2/issues –

6

ancak kendi başına yapmak uzantısı gerekmez ; Bir kukla var ayarlayabilirsiniz. Benim kodunda ardından üst taraftaki

{% set glob={} %} 

ve: Ben aşağıdaki kullanmak

{% set _ = glob.update({'disabled':True}) %} 

_ değişkenler sadece bir kukla, sen sonradan kullanmayın.

0

Eski bir iş parçacığına yanıt verdiğimin farkındayım. Ancak, Jinja'yı yakın zamanda kullanmaya başladım ve benzer bir soruna girdim: İç içe geçmiş döngülerde yazdırılan satırların miktarını saymam gerekiyordu. Çözümüm, bir sınıftaki bir sayaç değişkenini sarmalayıp bir örneği şablona geçirmekti. Benzer şekilde, buna göre

{% for voter in record.voters %} 
    {% if user == voter %} 
     {% status.set_disabled() %} 
    {% endif %} 
    {{ status }} # outputs: 'disabled' 
{% endfor %} 

render için şablona bir durum sınıfı örneğini geçirin böylece

class VoterStatus(object): 
    def __init__(self, status='active'): 
     self._status = status 

    def set_disabled(self): 
     self._status = 'disabled' 

    def __str__(self): 
     return self._status 

senin şablonunu değiştirme gibi bir sarmalayıcı sınıf kullanabilirsiniz:

tmplt.render(status=VoterStatus(), ...) 

... ve Bob senin amcan.