2010-08-09 50 views
35

Tôi có thể xem cách thêm thông báo lỗi vào trường khi sử dụng biểu mẫu, nhưng biểu mẫu mô hình thì sao?thông báo lỗi tùy chỉnh với Mẫu biểu mẫu

Đây là mô hình thử nghiệm của tôi

class Author(models.Model): 
    first_name = models.CharField(max_length=125) 
    last_name = models.CharField(max_length=125) 
    created = models.DateTimeField(auto_now_add=True) 
    updated = models.DateTimeField(auto_now=True) 

mô hình dạng của tôi

class AuthorForm(forms.ModelForm): 
    class Meta: 
     model = Author 

Các thông báo lỗi trên các lĩnh vực: first_name, và last_name là "lĩnh vực này là cần thiết". Làm cách nào để thay đổi điều đó trong một biểu mẫu mô hình?

Trả lời

29

Đối với trường hợp đơn giản, bạn có thể specify custom error messages

class AuthorForm(forms.ModelForm): 
    first_name = forms.CharField(error_messages={'required': 'Please let us know what to call you!'}) 
    class Meta: 
     model = Author 
+1

mát nhờ. Tôi không biết kết quả của việc đó là gì. Tài liệu nói rằng "Các trường được khai báo sẽ ghi đè các trường mặc định được tạo bằng cách sử dụng thuộc tính mô hình" vì vậy tôi nên làm tốt.Tôi cũng sẽ phải đặt lại max_field trên trường biểu mẫu. – iJK

+15

Có thực sự cần phải lặp lại các khai báo trường trong biểu mẫu không? Làm thế nào về nguyên tắc DRY django là tự hào? – paweloque

+0

Điều này không hoạt động: https://code.djangoproject.com/ticket/13693 – fjsj

7

cách easyest là để ghi đè lên các phương pháp làm sạch:

class AuthorForm(forms.ModelForm): 
    class Meta: 
     model = Author 
    def clean(self): 
     if self.cleaned_data.get('name')=="": 
     raise forms.ValidationError('No name!') 
     return self.cleaned_data 
15

Tôi đã băn khoăn về vấn đề này nhiều lần là tốt. Đó là lý do tại sao cuối cùng tôi đã viết một phần mở rộng nhỏ cho lớp ModelForm, cho phép tôi thiết lập các thuộc tính trường tùy ý - bao gồm các thông báo lỗi - thông qua lớp Meta. Mã và giải thích có thể được tìm thấy ở đây: http://blog.brendel.com/2012/01/django-modelforms-setting-any-field.html

Bạn sẽ có thể làm những việc như thế này:

class AuthorForm(ExtendedMetaModelForm): 
    class Meta: 
     model = Author 
     field_args = { 
      "first_name" : { 
       "error_messages" : { 
        "required" : "Please let us know what to call you!" 
       } 
      } 
     } 

Tôi nghĩ rằng đó là những gì bạn đang tìm kiếm, phải không?

+0

Đây là một cách tuyệt vời để thực hiện việc này. Chắc chắn nhiều DRY hơn là xác định lại các trường biểu mẫu. – suda

+0

@suda bạn không thực sự xác định lại, bạn đang ghi đè hành vi mặc định dựa trên mô hình được liên kết. tương tự như việc thay đổi đầu vào thành vùng văn bản, bạn sẽ ghi đè giá trị mặc định. – Chris

14

Một cách dễ dàng để thực hiện việc này là chỉ ghi đè lên nó trong init.

class AuthorForm(forms.ModelForm): 
    class Meta: 
     model = Author 

    def __init__(self, *args, **kwargs): 
     super(AuthorForm, self).__init__(*args, **kwargs) 

     # add custom error messages 
     self.fields['name'].error_messages = {'required': 'Please let us know what to call you!'} 
+0

Điều này hoạt động, chắc chắn sẽ chấp nhận là câu trả lời – Zac

+1

Đây là giải pháp tốt hơn nhiều so với tất cả các chủ đề khác bởi vì 1) Bạn không phải sử dụng bất kỳ phần mở rộng nào 2). về định nghĩa của trường mô hình. +1 –

+2

Một lưu ý nghĩ rằng, bạn phải sử dụng nó như thế này 'self.fields ['name']. Error_messages ['required'] = 'Hãy cho chúng tôi biết những gì để gọi cho bạn!'' Hoặc sử dụng '.update() 'phương pháp, nếu không bạn đặt lại tất cả các thông báo lỗi khác. –

35

New in Django 1.6:

ModelForm chấp nhận một số tùy chọn Meta mới.

  • Các trường được bao gồm trong danh sách localized_fields sẽ được bản địa hóa (bằng cách thiết lập bản địa hóa trên trường biểu mẫu).
  • Có thể sử dụng các tùy chọn nhãn, help_texts và error_messages để tùy chỉnh các trường mặc định, xem Overriding the default fields để biết chi tiết.

Từ rằng:

class AuthorForm(ModelForm): 
    class Meta: 
     model = Author 
     fields = ('name', 'title', 'birth_date') 
     labels = { 
      'name': _('Writer'), 
     } 
     help_texts = { 
      'name': _('Some useful help text.'), 
     } 
     error_messages = { 
      'name': { 
       'max_length': _("This writer's name is too long."), 
      }, 
     } 

liên quan: Django's ModelForm - where is the list of Meta options?

+0

tôi không hiểu _() xung quanh văn bản thông báo lỗi tùy chỉnh, vì vậy tôi đã thực hiện điều đó. nhưng đây là đoạn đầu tiên làm việc cho tôi. Tôi đang trên django 1.6. cảm ơn ngài! –

+2

Bạn được chào đón! Nếu bạn tò mò, chức năng gạch dưới là một phím tắt phổ biến cho một tiện ích quốc tế hóa: http://stackoverflow.com/questions/2964244/django-meaning-of-leading-underscore-in-list-of-tuples-used- to-defined-choice-fi – doctaphred

4

tôi có một giải pháp sạch hơn, dựa trên câu trả lời của jamesmfriedman. Giải pháp này thậm chí còn khô hơn, đặc biệt nếu bạn có nhiều trường.

custom_errors = { 
    'required': 'Your custom error message' 
} 

class AuthorForm(forms.ModelForm): 
    class Meta: 
     model = Author 

    def __init__(self, *args, **kwargs): 
     super(AuthorForm, self).__init__(*args, **kwargs) 

     for field in self.fields: 
      self.fields[field].error_messages = custom_errors 
1

Bạn có thể dễ dàng kiểm tra và đưa thông báo lỗi tùy chỉnh bằng cách ghi đè clean() phương pháp và sử dụng self.add_error(field, message):

def clean(self): 
    super(PromotionForm, self).clean() 
    error_message = '' 
    field = '' 
    # reusable check 
    if self.cleaned_data['reusable'] == 0: 
     error_message = 'reusable should not be zero' 
     field = 'reusable' 
     self.add_error(field, error_message) 
     raise ValidationError(error_message) 

    return self.cleaned_data 
Các vấn đề liên quan