2009-10-06 28 views

Trả lời

28

Các trường biểu mẫu dễ dàng tùy chỉnh:

class UpperCaseField(forms.CharField): 
    def clean(self, value) 
     try: 
      return value.upper() 
     except: 
      raise ValidationError 

về cơ bản bạn chỉ cần tạo một lớp kế thừa từ lĩnh vực mà hầu hết các giống những gì bạn muốn, sau đó viết lại phương pháp sạch() để nó trả về giá trị bạn muốn. Dưới đây là một ví dụ:

class MyObjectField(forms.ModelChoiceField): 
    # in this case, 'value' is a string representing 
    # the primary key of a MyObject 
    def clean(self, value): 
     try: 
      return MyObject.objects.get(pk=value) 
     except: 
      raise ValidationError 

tùy chỉnh widget mặt khác, là một chút hữu ích hơn, nhưng nhiều hơn một chút khó có thể làm bởi vì có một vài chi tiết phương pháp mà cần phải được viết để họ làm việc thông suốt.

+1

Cảm ơn bạn. Tôi nghĩ rằng tôi cần phải viết một widget tùy chỉnh bởi vì tôi cần phải tùy chỉnh rendering của trường. –

+7

Lưu ý: clean() chịu trách nhiệm chạy to_python(), validate() và run_validators(). Nếu bạn ghi đè lên clean() và không thực hiện chúng, bạn sẽ làm mọi thứ lộn xộn. – orokusaki

+3

orokusaki là đúng, nếu bạn ghi đè clean(), ít nhất bạn nên gọi nó là siêu thực hiện với 'super (UpperCaseField, self) .clean (value)' –

7

Nó không phải là một hướng dẫn, nhưng các cuộc đàm phán docs django của về vấn đề này một chút:

Nếu được xây dựng trong các lớp học hiện trường không đáp ứng nhu cầu của bạn, bạn có thể dễ dàng tạo ra lớp tùy chỉnh Field. Để thực hiện việc này, chỉ cần tạo một lớp con của django.forms.Field. Chỉ có yêu cầu của nó là nó triển khai phương thức clean() và phương thức __init__() chấp nhận các đối số cốt lõi được đề cập ở trên (bắt buộc, nhãn, ban đầu, tiện ích, help_text).

Bạn có thể đọc về phương pháp sạch và xem ví dụ at the django docs. Một lần nữa, không phải là một hướng dẫn, nhưng hữu ích.

Tôi thấy mình đang học rất nhiều bằng cách đọc mã trong một số dự án ứng dụng django có sẵn, chẳng hạn như django-extensions, ghi đè trường biểu mẫu và là công cụ học tập tốt (ít nhất là đối với tôi). Điều này có thể giúp bạn bắt đầu.

14

Như mọi khi với mã nguồn mở, bạn sẽ học rất nhiều bằng cách đọc chính nguồn. Xem mô-đun django.forms.fields để xem cách tất cả các trường biểu mẫu khác nhau được xác định - hầu hết trong số đó là lớp con của những trường khác, vì vậy bạn có thể sao chép và thay đổi những gì bạn cần.

+8

Liên kết đến nguồn mới nhất: https://github.com/django/django/blob/master/django/forms/fields.py –

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