2010-02-04 15 views

cevap

6

Bu, şablonunuz aracılığıyla tamamen yapılabilir.

Aşağıdaki örnek

<input type="text" class="reg-txt{% if form.fieldname.errors %} errors{% endif %}"/> 

Bu görünüm & Django formu kodunuzu değiştirmeden istediğiniz arayüz sağlamak sağlayan inşa size kullanabilirsiniz test etmek istiyorum her form alanı için form şablonunu oluşturmak.

+5

form veya widget'ı yapılabilir bir şey var mı seviye? Bu oldukça ayrıntılı görünüyor, ben her geçersiz giriş alanında bu hata sınıfına sahip olmak istiyorum, textarea, seç ... –

26

ile bunu mümkün olmalıdır

-

Sadece formu sınıfına & bir özelliği eklemelerini yeni özelliği Django 1.2 Gitmek güzelsin. Bu özellik "yeni 1,2" notu altında docs belirtilen, ancak django.forms.forms.BoundField.css_classes de büyü İşte API reference, ve bir örnek bulabilirsiniz:

class MyForm(forms.Form): 
    required_css_class = "required" 
    error_css_class = "error" 
+1

Ben 1.3 çalıştıran ve bu sınıfların hiçbiri şablon çıktı hiç. Alanı for döngüsünde basit {{field}} ile yapıyorum. Bu işi yapmak için özel bir şey yapmalı mıyım? Sadece tablolar çıktı alırken çalışır mı? – Justin

+4

Tüm formu {{form}} kullanarak çıkarmanız gerekiyor, eğer bu şekilde yaparsanız, formatları (p, tablo ve liste) herhangi birinde sınıfları göreceksiniz. –

+0

@BrianFisher, cevabınıza dayalı olarak, istenen formun/zorunlu sınıfın alınabilmesi için {{form}} kabulünü veya formun tamamında ve hatadaki sınıfların daha iyi kontrol edilmesini istiyorsanız kendi öğelerinizi oluşturmak anlamına mı geliyor? – Chris

26

sen oluşturmak için hata CSS sınıfı yerleştirmek istiyorsanız giriş widget'ları (değil onların konteynerler), aşağıdaki birinden form sınıfı türetebilirsiniz:

class StyledErrorForm(forms.Form): 
    def is_valid(self): 
     ret = forms.Form.is_valid(self) 
     for f in self.errors: 
      self.fields[f].widget.attrs.update({'class': self.fields[f].widget.attrs.get('class', '') + ' error'}) 
     return ret 
+3

Küçük bir yakalamaya dikkat edin, -, bu alan widget bildirimi (yani, attrs') belirtilen herhangi bir sınıfı geçersiz kılar. Hata sınıfını eklemek için, bu satırı kullanın (biraz korkunç): 'self.fields [f] .widget.attrs.update ({'class': self.fields [f] .widget.attrs.get ('class') , '') + 'error'}) ' – gregoltsov

+0

Teşekkür ederim Gregory, kodumu düzelttim. – Luca

1

bir Özel Şablon kullanarak ...

Şahsen inşa Django hata classing çözümlerini kullanarak çok şansım olmadı , ve ek olarak Ben, hatalar üzerinde oluşturulmuş 'striptizler' şablon filtresini kullanmaktan hoşlanırım, nasıl olursa olsun nasıl güzelce oluşturulacağını anlayamadığım tüm html listesi öğelerinden kurtulmak isterim.

Aşağıdaki özel şablonu 'error_id' olarak sınıflandırmak için kullanıyorum.

@register.filter(is_safe=True) 
@stringfilter 
def error_id(value): 
    if value=='': 
     return '' 
    else: 
     return r'<span class="error_id">'+value+'</span>' 

kullanarak şablonunda bireysel hataları Render:

{{ form.my_field.errors|striptags|error_id}} 

Veya böyle bir şey kullanarak tüm formu işlemek:

<table border="1" cellpadding="5px" align="center"> 
     {% for field in form.visible_fields %} 
      <tr> 
         <td> {{ field.label_tag }}: </td> 
         <td> {{ field }} </td> 
         <td> {{ field.errors|striptags|error_id }} </td> 
      </tr> 

     {% endfor %} 

    </table> 
+1

"ul" yerine satır içi hataları görüntülemek için {{field.errors.join: ""}} 'ifadesini kullanıyorum. Ve HTML şeyler yok. – Altaisoft

+1

Bu güzel ipuçları için django.template.defaultfilters.stiptags – pymarco

+0

adresinden gelen filtrenizden strip etiketlerini arayabilirsiniz. – Ninga