2011-10-17 21 views
8

Django projemde özel bir izin uygulaması uyguluyorum ve belirli bir nesne örneği için oturum açmış bir kullanıcının izinlerini denetleyen özel bir şablon etiketinin nasıl uygulanacağı konusunda kayboluyorum. Çekin sonucuna dayalı bir HTML parçasını gösterir.if..else özel şablon etiketi

Şimdi ne var (yalancı kod) 'dir:

{% check_permission request.user "can_edit" on article %} 
    <form>...</form> 
{% endcheck %} 

('check_permission:' özel şablon etikettir).

Şablon etiketi, kullanıcı, izin ve nesne örneğini alır ve ilişikteki HTML'yi (form) döndürür. Bu şu anda iyi çalışıyor. Ben yaklaşık the assignment tag okudum

{% if check_permission request.user "can_edit" on article %} 
    <form>...</form> 
{% else %} 
    {{ article }} 
{% endif %} 

ama benim korkum bu (önceki üzerine yazmamaya anlam ile bağlam değişken alanı kirletme olduğunu ifade etti:

Ne Ancak yapmak istediğim bir şey gibidir izin içeriği değişkenleri. Başka bir deyişle, içerik değişkenleri farklı düzeylerde tanımlandığından (benim durumumdaki görünüm, ara katman ve şimdi bu atama şablonu etiketi), sürdürülebilirlik konusunda endişeleniyorum.

cevap

13

İfadeler içeriyorsa şablon filtreleri kullanabilirsiniz. Yani bir filtre olarak etiketinizi yazabilirsiniz: Bir filtreye farklı türde birden fazla argüman geçmek zor olduğunu

{% if request.user|check_can_edit:article %} 

Not, bu yüzden kullandım yukarıda muhtemelen izni başına bir filtre kullanmak isteyeceksiniz check_can_edit.

+0

Teşekkürler, filtreler gerçekten bir seçenek olabilir. Ancak farklı izinlerin olduğunu tahmin ediyorum (sadece temel CRUD değil, bazı çok spesifik olanları da değil), aynı zamanda özel şablon filtrelerinin eşit bir miktarını oluşturmak zorundayım. Belki de özel izinler modelimi yeniden düşünmeliyim. Bir filtreye birden fazla argüman iletmenin zor olduğunu söylerseniz, bunun mümkün olduğunu mu söylüyorsunuz? Bunun olmadığını düşünmüştüm, bu yüzden biraz açıklayabilir misin? – LaundroMat

+1

Gelecek ziyaretçilere güncelleme: Sanırım zincirleme filtrelerle (ör. {{Request.user | has_permission: "entries.entry.can_edit," | has_permission_on: article}} '.) Özel has_permission şablon filtresi ile çözmeyi deneyeceğim. kullanıcı ve gerekli izni verir, has_permission_on sonra bu değerleri alır, bunları makale değişkenine karşı kontrol eder ve Doğru veya Yanlış döndürür. – LaundroMat

12

Şablonunuzun okunabilirliğini geliştirmek için daha fazla python kodu satırı yazmak istiyorsanız bunu kesinlikle yapabilirsiniz! :) Etiket içeriğini kendiniz, hatta aldığınız parametreleri bile ayrıştırmanız ve sonra da bunları değişkenler üzerinde kullanmak isterseniz çözmeniz gerekir.

{% load mytag %} 
{% mytag True %}Hi{% else %}Hey{% endmytag %} Bro 

Veya bir değişkenle:

aşağıda uygulanan etiket bu gibi kullanılabilir Yani

{% mytag myobject.myflag %}Hi{% else %}Hey{% endmytag %} Bro 

, burada ben yaptım yolu şudur:

from django.template import Library, Node, TemplateSyntaxError 

register = Library() 

@register.tag 
def mytag(parser, token): 
    # Separating the tag name from the "test" parameter. 
    try: 
     tag, test = token.contents.split() 
    except (ValueError, TypeError): 
     raise TemplateSyntaxError(
      "'%s' tag takes two parameters" % tag) 

    default_states = ['mytag', 'else'] 
    end_tag = 'endmytag' 

    # Place to store the states and their values 
    states = {} 

    # Let's iterate over our context and find our tokens 
    while token.contents != end_tag: 
     current = token.contents 
     states[current.split()[0]] = parser.parse(default_states + [end_tag]) 
     token = parser.next_token() 

    test_var = parser.compile_filter(test) 
    return MyNode(states, test_var) 


class MyNode(Node): 
    def __init__(self, states, test_var): 
     self.states = states 
     self.test_var = test_var 

    def render(self, context): 
     # Resolving variables passed by the user 
     test_var = self.test_name.resolve(context, True) 

     # Rendering the right state. You can add a function call, use a 
     # library or whatever here to decide if the value is true or false. 
     is_true = bool(test_var) 
     return self.states[is_true and 'myvar' or 'else'].render(context) 

Ve bu kadar. HTH.

+0

gerçek cevap burada – snakesNbronies