2011-02-09 7 views
5

formlara ilişkilendirme şekli eklemek için aşağıdaki şablonu olduğunu varsayalım:Django html şablonları

nasıl form.openid_identifier bir css sınıfı ekleyebilir

<div id="openid_input_area"> 
{{ form.openid_identifier }} 
    <input name="bsignin" type="submit" value="{% trans "Sign in" %}"> 
</div> 
? Ben SOC ilkeleri kalarak ediyorum ve tasarımcılar şablonlar iyileşmesini bekliyoruz gibi

Ben DEĞİL formu modeline ancak şablonun kendisinde bu yapmak istiyorsunuz.

Bu konuda dokümanlar üzerinde hiçbir şey bulamadım. Bunu şablonda yapmanın bir yolu var mı?

cevap

16

Problemimin basit bir çözüm kodlamak için idare ettik

from django import template 

register = template.Library() 

def htmlattributes(value, arg): 
    attrs = value.field.widget.attrs 


    data = arg.replace(' ', '') 

    kvs = data.split(',') 

    for string in kvs: 
     kv = string.split(':') 
     attrs[kv[0]] = kv[1] 

    rendered = str(value) 

    return rendered 

register.filter('htmlattributes', htmlattributes) 

Ve de yapmam gereken şablonu:

{{ form.openid_identifier|htmlattributes:"class : something, id: openid_identifier" }} 
2

Düz Django'da başka bir yol bilmiyorum. form.field veya form.as_p gibi kısayollar gerçekten işe başlamanıza rağmen, sonuçta düz html'ye geri dönebilirsiniz. Ben böyle görüyorum. Oluşturma konusunda daha fazla kontrole ihtiyaç olmadığı söylenemez. Django posta listesinde this discussion about form rendering okumayı hatırlıyorum.

Simon Willison/tasarımcıları için daha fazla kontrol sağlayan bir kütüphanede çalışıyor. Kaynaklarını on github bulabilirsiniz. Biraz daha yaşlı, bu yüzden artık işe yaramayabilir. Ama sorunun ilgili, bu örnek, size yararlı olabilir gibi görünüyor:

{% field form.name class="myclass" %} 
<!-- renders as --> 
<input type="text" name="name" id="id_name" class="myclass"> 

Aslında bu işlevselliği elde etmek kolay olmalıdır. Bir form alanını kabul eden, widget'lar niteliklerini (zaten formda belirtebileceğinizleri) güncelleyen ve alanı oluşturan bir şablon etiketine ihtiyacınız vardır.

Bir form üzerinde yineleme, BoundField örneklerini verir, bu da kendisini __unicode__ yöntemiyle işler. Tüm anahtar kelime bağımsız değişkenlerini pencere öğesi işleme işlevine iletmeniz gerekir. Bu fikrin taslağı:

Ben custom template tag yazdı:

@register.simple_tag 
def field(boundfield, **kwargs): 
    if self.field.show_hidden_initial: 
     return self.as_widget(attrs=kwargs) + self.as_hidden(only_initial=True) 
    return self.as_widget(attrs=kwargs)