2012-11-30 43 views
9

Tôi đang thực hiện một mô hình Django ModelForm tạo/xác thực/lưu hoạt động cơ bản. Các phương thức clean tùy chỉnh của tôi không được gọi khi is_valid() đang được gọi khi chạy mã trong trình gỡ lỗi Eclipse và tôi thiết lập một điểm ngắt sau khi tạo biểu mẫu và gọi hàm is_valid().Django ModelForm không gọi điện thoại sạch

Tôi đã truy tìm thông qua mã cơ sở Django nhiều lần và có vẻ như từ điển lỗi trên lớp ModelForm không bao giờ được đặt thành Không, kích hoạt xác thực. Tôi nghi ngờ rằng điều này là do sự tương tác với trình gỡ lỗi truy cập thuộc tính _errors của ModelForm để hiển thị trong ngăn biến.

Khi tôi xóa tất cả các điểm ngắt và để dòng mã tự nhiên, tôi có thể chứng minh rằng mã sạch tùy chỉnh đang chạy bằng cách phát hành các lệnh in.

Đây có phải là một lỗ hổng trong thiết kế Django ModelForm, một vấn đề về Eclipse hay tôi đang sủa cây sai?

models.py

from django.db import models 

class TestModel1(models.Model): 
    field1 = models.CharField(max_length=45) 
    field2 = models.IntegerField(default=2) 
    field3 = models.CharField(max_length=45, null=True, blank=True) 

forms.py

from order.models import TestModel1 
from django.forms import ModelForm 

class OrderTestForm(ModelForm): 

    def clean_field1(self): 
     return self.cleaned_data['field1'] 

    def clean_field2(self): 
     return self.cleaned_data['field2'] 

    class Meta: 
     model = TestModel1 

khai thác thử nghiệm của tôi:

from forms import OrderTestForm 

row = {'field1': 'test value', 'field2': '4', } 

ff = OrderTestForm(row) 

#ff.full_clean() 
if ff.is_valid(): 
    ff.save() 
else: 
    print ff.errors 
+0

Hãy thử: ff = OrderTestForm (data = hàng) – Brandon

+0

Cảm ơn bạn đã đề xuất. Tôi đã thử điều đó mà không thay đổi. Tôi nên làm rõ vấn đề một chút. Nếu tôi có một breakpoint Eclipse về việc tạo ModelForm và STEP và sau đó tiếp tục, các điểm ngắt trong sạch sẽ không được kích hoạt. NHƯNG bất kỳ câu lệnh in nào trong phần làm sạch được in sau khi tôi thực hiện bước đầu tiên đó. Điều đó có nghĩa là, tôi tin rằng khi Eclipse cố gắng truy cập đối tượng ModelForm để đọc các thuộc tính của nó, nó sẽ làm sạch nó. Đây là hành vi dự kiến ​​theo các tài liệu Django. Tuy nhiên, nó tạo ra một vấn đề, vì is_valid() sẽ không hoạt động đúng. –

+0

Bạn có thể đăng bài kiểm tra đầy đủ của mình không? – Brandon

Trả lời

1

gì nếu bạn cố gắng:

from order.models import TestModel1 
from django.forms import ModelForm 

class OrderTestForm(ModelForm): 
    class Meta: 
     model = TestModel1 

    def clean_field1(self): 
     value = self.cleaned_data['field1'] 
     print value 
     return value 

    def clean_field2(self): 
     value = self.cleaned_data['field2'] 
     print value 
     return value 
+0

Tôi có cùng một vấn đề như OP, và các chất tẩy rửa trường riêng lẻ cũng không được gọi. – GreenAsJade

0

Tôi đã tìm thấy "câu trả lời" là loại câu trả lời không phải là câu trả lời. Trường hợp sử dụng chính xác đã nhận được tệp CSV từ khách hàng. Sau khi kiểm tra tệp dữ liệu thực tế của khách hàng, các trường dữ liệu được đệm bằng không gian - nhiều không gian. Tôi cắt đầu vào và đẩy mà cắt từ điển vào hình thức và tất cả mọi thứ đã làm việc. Vẫn không giải thích tại sao nhật thực bị nghẹn về điều này.

0

Tôi đã gặp vấn đề tương tự và cố gắng đào sâu hơn một chút và gỡ lỗi khung.

Có lẽ sự khác biệt giữa các hình thức thường xuyên và các hình thức mô hình mà nguyên nhân này không làm việc, nhưng hack này (trọng is_valid() thay vì clean(...)) làm việc cho tôi:

def is_valid(self): 
    #run whatever ModelForm validations you need 
    return super(OrderTestForm, self).is_valid() 
+0

Vấn đề là bạn không thể chạm vào 'self.cleaned_data []' trong phương thức đó vì nó chưa được tạo. –

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