2010-07-09 22 views
7

Tôi muốn tạo các tiện ích bổ sung các lớp cụ thể để đánh dấu phần tử khi trường được liên kết có lỗi.Django: Làm cách nào để kiểm tra xem có lỗi trường nào trong định nghĩa widget tùy chỉnh không?

Tôi đang gặp khó khăn khi tìm thông tin về cách kiểm tra xem một trường có lỗi liên kết với nó hay không, từ bên trong mã định nghĩa widget.

Hiện tại tôi có mã tiện ích con sau (tiện ích cuối cùng sẽ sử dụng đánh dấu phức tạp hơn).

from django import forms 
from django.utils.safestring import mark_safe 
class CustomTextWidget(forms.Widget): 
     def render(self, name, value, attrs): 
      field_has_errors=False # change to dynamically reflect field errors, somehow 
      if field_has_errors: 
       error_class_string="error" 
      else: 
       error_class_string="" 
      return mark_safe(
      "<input type=\"text\" class=\"%s\" value=\"%s\" id=\"id_%s\" name=\"%s\">" % (error_class_string, value, name, name) 
      ) 

Mọi người có thể làm sáng tỏ một cách hợp lý để điền vào trường_has_errors Boolean tại đây không? (hoặc có lẽ đề xuất một cách tốt hơn để hoàn thành những gì tôi đang cố gắng làm). Cảm ơn trước.

Trả lời

9

Như Jason nói, widget không có quyền truy cập vào các lĩnh vực riêng của mình. Tôi nghĩ rằng một giải pháp tốt hơn mặc dù là sử dụng bản chất tầng của CSS.

{% for field in form %} 
<div class="field{% if field.errors %} field_error{% endif %}"> 
{{ field }} 
</div> 
{% endfor %} 

Bây giờ trong CSS của bạn, bạn có thể làm:

div.field_error input { color: red } 

hoặc bất cứ điều gì bạn cần.

+0

Đây chắc chắn là cách để đi và thực sự là cách tiếp cận mà tôi luôn thực hiện trong công việc của riêng mình. Ví dụ tôi cung cấp đã được gộp lại với nhau trong một nỗ lực để hiển thị việc truyền các thuộc tính cho các widget (không chỉ các widget tùy chỉnh), tuy nhiên nó nên tránh vì nó không phải là DRY. –

+0

hai năm sau nó đã giúp tôi. Cảm ơn bạn :) – Houman

+0

Tại sao họ không chuyển thông tin lỗi cho tiện ích con? Có vẻ như nó sẽ là hợp lý với tôi, vì nó là phổ biến để làm cho lỗi ngay bên cạnh đầu vào cho lĩnh vực này. – Andy

3

Tiện ích không có kiến ​​thức về trường mà nó đang được áp dụng. Đây là trường duy trì thông tin về lỗi. Bạn có thể kiểm tra error_messages trong init phương pháp hình thức của bạn, và tiêm một lớp lỗi widget của bạn cho phù hợp:

class YourForm(forms.ModelForm): 
    def __init__(self, *args, **kwargs): 
     super(YourForm, self).__init__(*args, **kwargs)  
     attrs = {} 
     if self.fields['your_field'].error_messages is not None: 
      attrs['class'] = 'errors' 
     self.fields['your_field'].widget = YourWidget(attrs=attrs) 
+0

Câu trả lời DRY tốt hơn nhiều – Alvaro

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