2010-02-04 35 views

Trả lời

6

Điều này có thể được thực hiện hoàn toàn thông qua mẫu của bạn.

Bạn xây dựng mẫu hình thức cho từng lĩnh vực hình thức mà bạn muốn kiểm tra, bạn có thể sử dụng các ví dụ sau xây dựng

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

này cho phép bạn cung cấp giao diện bạn muốn mà không sửa đổi quan điểm & mẫu mã django.

+5

Có bất cứ điều gì có thể được thực hiện trên các hình thức hoặc phụ tùng cấp độ? Điều này có vẻ khá dài dòng, tôi muốn có lớp lỗi này trên mọi trường nhập không hợp lệ, văn bản, chọn ... –

26

Nó bây giờ dễ dàng - Tính năng mới trong Django 1,2

Chỉ cần thêm một thuộc tính trên lớp mẫu & bạn tốt để đi. Tính năng này được đề cập trong các tài liệu dưới một "mới trong 1.2" Đáng chú ý, nhưng bạn có thể tìm thấy sự kỳ diệu tại django.forms.forms.BoundField.css_classes Đây là API reference, và một ví dụ:

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

Tôi đang chạy 1,3 và không phải lớp nào trong số các lớp này có trong bản mẫu đầu ra. Tôi đang vẽ trường bằng {{field}} đơn giản trong vòng lặp for. Bất cứ điều gì đặc biệt tôi phải làm để thực hiện công việc đó? Nó chỉ hoạt động khi xuất bảng? – Justin

+4

Bạn cần xuất toàn bộ biểu mẫu bằng {{form}}, nếu bạn làm như vậy bạn sẽ thấy các lớp ở bất kỳ định dạng nào (p, bảng và danh sách). –

+0

@BrianFisher dựa trên câu trả lời của bạn có nghĩa là chấp nhận {{form}} để nhận lỗi mong muốn/lớp bắt buộc hoặc xây dựng các phần tử của riêng bạn nếu bạn muốn kiểm soát tốt hơn toàn bộ biểu mẫu và các lớp bị lỗi? – Chris

26

Nếu bạn muốn đặt lớp CSS lỗi của bạn để tạo thành widget đầu vào (không container của họ), bạn có thể lấy được lớp mẫu của bạn từ một sau:

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

Xem ra cho một bản ghi nhỏ, mặc dù - điều này sẽ ghi đè bất kỳ lớp nào được chỉ định trong khai báo widget trường (tức là 'attrs'). Để chỉ cần nối thêm lớp lỗi, sử dụng dòng này thay vào đó (hơi khủng khiếp): 'self.fields [f] .widget.attrs.update ({'class': self.fields [f] .widget.attrs.get ('class' , '') + 'error'}) ' – gregoltsov

+0

Cảm ơn bạn Gregory, tôi đã sửa mã của mình. – Luca

1

sử dụng một mẫu tuỳ chỉnh ...

Cá nhân không bao giờ có nhiều may mắn bằng cách sử dụng được xây dựng trong Django lỗi classing giải pháp và bên cạnh , Tôi thích sử dụng bộ lọc mẫu 'striptags' được xây dựng trên các lỗi, để loại bỏ tất cả các công cụ danh sách html mà tôi không thể tìm ra cách để hiển thị độc đáo.

Tôi sử dụng mẫu tùy chỉnh sau để phân loại chúng thành 'error_id'.

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

Render các lỗi cá nhân trong mẫu của bạn sử dụng:

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

Hoặc làm cho toàn bộ hình thức sử dụng một cái gì đó như:

<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

Tôi sử dụng '{{field.errors.join:" "}}' để hiển thị nội dòng lỗi thay vì 'ul'. Và không có nội dung HTML. – Altaisoft

+1

Bạn có thể gọi các thẻ từ trong bộ lọc của mình từ django.template.defaultfilters.stiptags – pymarco

+0

cảm ơn tuyệt vời vì những mẹo hay này – Ninga

Các vấn đề liên quan