2012-10-09 33 views
6

Cố gắng giải quyết vấn đề thú vị ngay bây giờ.Xác thực mẫu Django ModelForm

Tôi có mô hình Django với trường image không bắt buộc, nhưng được đặt thành giá trị mặc định khi tạo phiên bản mẫu mới.

class Product(models.Model): 
    image = models.ImageField(upload_to='/image/directory/', default='/default/image/path/', blank=True) 

Tôi cũng có ModelForm dựa trên mô hình đó, bao gồm trường image và có một số xác thực tùy chỉnh.

class ProductForm(forms.ModelForm): 
    class Meta: 
     model = Product 
     fields = ('image',) 

    def clean_image(self): 
     image = self.cleaned_data.get('image', False) 
     if image: 
      # validate image 
     return None 

Vấn đề là per the docs, gọi is_valid() trên ModelForm gây nên mô hình xác nhận ngoài việc tạo xác nhận, vì vậy khi một người dùng gửi các hình thức mô hình mà không có một hình ảnh, tùy chỉnh mã xác nhận hình thức của tôi cố gắng để xác nhận mô hình mặc định hình ảnh, thay vì không làm gì cả.

Làm cách nào để không làm bất kỳ điều gì trừ khi bản thân biểu mẫu có giá trị cho trường image?

+0

'blank = True' là xác thực ở cấp cơ sở dữ liệu và' null = True' là xác thực ở cấp mô hình, vì vậy bạn cần phải thêm 'null = True'. – karthikr

+3

@karthikr: Điều đó không đúng. 'null là hoàn toàn liên quan đến cơ sở dữ liệu, trong khi đó trống là có liên quan đến xác thực. Nếu một trường có trống = Đúng, xác thực biểu mẫu sẽ cho phép nhập một giá trị rỗng. Nếu một trường trống = False, trường sẽ được yêu cầu.'. [Xem thêm thông tin tại đây.] (Https://docs.djangoproject.com/en/dev/ref/models/fields/#blanko) –

+2

@karthikr Tôi nghĩ bạn có thể muốn kiểm tra lại điều đó. Từ tài liệu 'null là hoàn toàn liên quan đến cơ sở dữ liệu, trong khi trống là liên quan đến xác thực.' https://docs.djangoproject.com/en/dev/ref/models/fields/#field-options –

Trả lời

10

Chỉ cần giải quyết nó theo cách khá đơn giản. Thêm câu trả lời ở đây trong trường hợp nó hữu ích cho bất kỳ ai khác.

The Django docs state that

... một trường hợp hình thức mô hình liên kết với một đối tượng mô hình sẽ chứa một thuộc tính self.instance cung cấp cho phương pháp hình thức mô hình truy cập vào mà dụ mô hình cụ thể.

Vì vậy, thay vì kiểm tra xem ModelForm có giá trị hình ảnh hay không, tôi chỉ kiểm tra xem giá trị hình ảnh đã thay đổi từ phiên bản đã lưu chưa. Mẫu xác thực bây giờ trông giống như sau:

class ProductForm(forms.ModelForm): 
    class Meta: 
     model = Product 
     fields = ('image',) 

    def clean_image(self): 
     image = self.cleaned_data.get('image', False) 
     if not self.instance.image == image: 
      # validate image 
     return None 

Sự cố được giải quyết!

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