2009-09-24 31 views
11

Tôi cần nêu một ngoại lệ trong phương thức lưu của mô hình. Tôi hy vọng rằng một ngoại lệ tồn tại sẽ bị bắt bởi bất kỳ django ModelForm sử dụng mô hình này bao gồm các hình thức quản trị.Nâng cao ValidationError từ phương thức lưu của mô hình django?

Tôi đã cố gắng nâng cao django.forms.ValidationError, nhưng điều này dường như bị vô hiệu hóa bởi biểu mẫu quản trị viên. Mô hình thực hiện cuộc gọi thủ tục từ xa vào thời gian lưu và không được biết cho đến khi cuộc gọi này xảy ra nếu đầu vào hợp lệ.

Xin cảm ơn, Pete

Trả lời

8

Hiện không có cách nào để thực hiện xác thực trong các phương pháp lưu mô hình. Tuy nhiên, điều này được phát triển, như là một nhánh xác thực mô hình riêng biệt, và nên được sáp nhập vào thân cây trong vài tháng tới.

Trong thời gian chờ đợi, bạn cần thực hiện xác thực ở cấp biểu mẫu. Việc tạo một lớp con ModelForm với phương thức clean() thực hiện cuộc gọi từ xa của bạn và tăng ngoại lệ cho phù hợp và sử dụng cả điều này trong quản trị và làm cơ sở cho các biểu mẫu khác của bạn.

+3

django đã bumming tôi ra gần đây. Tôi đã đi với cách tiếp cận này, nhưng tôi không hài lòng. Mã mà sửa đổi một mô hình không thuộc về một phương pháp sạch. – slypete

+0

Chỉ cần đăng ký, chi nhánh bạn đã nói đến đã được hợp nhất chưa? – rennat

+5

Đó là một phần của Django 1.2: http://docs.djangoproject.com/en/dev/ref/models/instances/#validating-objects – Tom

10

Kể từ Django 1.2, đây là những gì tôi đã làm:

class MyModel(models.Model): 

    <...model fields...> 

    def clean(self, *args, **kwargs): 
     if <some constraint not met>: 
      raise ValidationError('You have not met a constraint!') 
     super(MyModel, self).clean(*args, **kwargs) 

    def full_clean(self, *args, **kwargs): 
     return self.clean(*args, **kwargs) 

    def save(self, *args, **kwargs): 
     self.full_clean() 
     super(MyModel, self).save(*args, **kwargs) 

này có lợi ích của làm việc cả trong và ngoài của admin.

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