2011-08-22 15 views
6

Bir Django şablonunda isinstance/issubclass yapmanın bir yolu var mı? Kendi şablon etiketimi yazabileceğimin farkındayım, ancak bunun yanlış bir şey yaptığımı veya açık bir şeyi kaçırdığımı düşünmeme neden olması beni şaşırtmadı.IsInstance?

Koleksiyonumda yinelemeli iken görüntülediğim öğeye bağlı olarak iki farklı biçimlendirme segmenti görüntülemek istiyorum. Teşekkürler!

cevap

5

Bunların tümü ortak bir taban türünden devralınırsa, ancak hangi tür olduğunu bilmeniz gerekiyorsa, yalnızca türünü döndüren bir yöntem uygulamak isteyebilirsiniz - sonra if foo.get_type == 'type1' (veya her neyse) senin şablonunda.

0

Burada bir şeyleri kaçırıyorsunuz: şablondaki tek mantık, şablon oluşturma işlemlerini gerçekleştiriyor. isinstance/issubclass açıkça görünüm mantığı gibi kokuyor ve görünümde olmalıdır. Şablon oluşturma (sanırım öyle olan) bu işlevlerin bağlıdır varsa, görünümde mantığını uygulamak ve sadece bilmesi gerekenleri şablonu geçmelidir:

# in the view: 
if isinstance(some_obj, SomeClass): 
    do_fancy_template_stuff = True 
else: 
    do_fancy_template_stuff = False 

# in the template: 
{% if do_fancy_template_stuff %} 
    <fancy_template_stuff /> 
{% endif %} 

Unutmayın: Django çiftleşmiş motoru oldu Tasarımcılar gibi programcı olmayanların akılda tutulmasıyla oluşturuldu.

+4

Hmmm, ben genelde açıklamalarla hemfikir bir piton Sınıf olduğunu göstermek cevabını Düzenlendi, ama bu kadar uzak tuttuğum kadar emin değilim. Kullanım durumum, genel bir taban türü olan, ancak koleksiyonun içinde karıştırılmış öğelerden oluşan bir koleksiyona sahibim. Bir foo bunun gibi görünmeli, bir çubuk benzer bir şekilde, fakat biraz farklı bir şekilde gösterilmelidir. Görüntülenecek biraz farklı alanlar var, dolayısıyla farklı görüntü parçaları, bu yüzden {% if item.field_that_bars_have%} veya benzeri diyebiliriz, ancak bu kötü görünüyor. – Ludo

+0

Bunu işlemenin doğru yolu, özel bir etiket, render_result_item veya doğru görüntü parçasını seçebilecek bir şey oluşturmaktır. Bu şekilde mantık, programcı olmayan/tasarımcımızın onu bulamayacağı bir yere koyma pahasına olsa da, görünüm şablonundan çıkar. Ya da bir isinstance templatetag yazabilirim. Ya da modele bir get_type veya başka bir şey ekleyebilirim. Şimdi katılıyorum - cevabınız için teşekkürler :). – Ludo

8

Buradaki basit bir şablon filtresinin, en iyiye uygun olduğunu düşünüyorum. Bunu uygulamak gerçekten hızlı ve kolay. Böyle bir şey: templatetags içinde

/my_filters.py: Şablonunuzdaki

from django import template 
from django.utils.importlib import import_module 

register = template.Library() 

@register.filter 
def isinst(value, class_str): 
    split = class_str.split('.') 
    return isinstance(value, getattr(import_module('.'.join(split[:-1])), split[-1])) 

: Yukarıdaki rağmen

{% load my_filters %} 

... 

{% if myvar|isinst:"mymodule.MyClass" %} 
...do your stuff 
{% endif %} 

bir örnek kod (test), ben Çalışması gerektiğine inanıyorum. özel şablon Filtreler hakkında daha fazla bilgi için lütfen aşağıya bakınız the django documentation

DÜZENLEME: filtre argümanı aslında bir dize değil,

+0

Bir modelin tam yoluna başvurmak, bu çözümü arka uçtaki yeniden düzenlemeler için kırılgan hale getirir, ayrıca şablon/html tasarımcısının bu yolları bilmesini gerektirir. Ekibiniz arka plan programcılarına ve şablon tasarımcılarına bölünmüşse bunu yapmanın en iyi yolu değil. –

+0

Tamamen katılıyorum.Buradaki amaç, soruyu cevaplamaktır; Bu, şablonlarınızda koşullu şeyler yapmak için en iyi uygulama değildir. – ppetrid

İlgili konular