2010-10-06 10 views
10

Ok, tôi đã nhìn chằm chằm vào điều này trong nhiều giờ cố gắng tìm ra những gì đang xảy ra, vô ích. Tôi đang cố gắng tạo một ModelForm bằng cách sử dụng từ khóa 'instance' để chuyển nó thành một cá thể mô hình hiện có và sau đó lưu nó. Đây là ModelForm (tước đáng kể từ bản gốc trong nỗ lực của tôi để xác định nguyên nhân của vấn đề này):Django ModelForm không xác thực không có lỗi

class TempRuleFieldForm(ModelForm): 
    class Meta: 
     model = RuleField 

và đây là đoạn code Tôi đang chạy:

>>> m = RuleField.objects.get(pk=1) 
>>> f = TempRuleFieldForm(instance=m) 
>>> f.is_valid() 
False 

Các mô hình đối tượng (m ở trên) là hợp lệ và nó tiết kiệm tốt, nhưng hình thức sẽ không xác nhận. Bây giờ, theo như tôi có thể nói, mã này là giống hệt với các tài liệu Django ví dụ được tìm thấy ở đây: http://docs.djangoproject.com/en/dev/topics/forms/modelforms/#the-save-method, mặc dù rõ ràng là tôi đang thiếu một cái gì đó. Tôi sẽ đánh giá cao một số đôi mắt tươi để cho tôi biết những gì tôi đã sai.

Cảm ơn

+2

'f.errors' in ra sao? – sdolan

Trả lời

21

Lưu ý rằng liên kết của bạn không gọi f.is_valid(), nó chỉ lưu trực tiếp. Điều này có khả năng gây hiểu nhầm một chút.

Điểm có ích là instantiating một hình thức chỉ với một tham số instance nhưng không data không không ràng buộc nó vào dữ liệu, và do đó các hình thức không hợp lệ. Bạn sẽ thấy rằng f.is_bound là Sai.

Phía sau hậu trường, instance thực sự giống như truyền dữ liệu initial, như ghi chú tài liệu chỉ được sử dụng để hiển thị dữ liệu ban đầu và không được sử dụng để lưu. Bạn có thể sẽ được hưởng lợi từ việc đọc số notes on bound and unbound forms.

+3

+1. "Ví dụ không ngụ ý bị ràng buộc": Đây là lý do chính xác. –

+0

Cảm ơn bạn, điều đó có ý nghĩa hoàn hảo. Tôi biết nó sẽ là một cái gì đó đơn giản ... – oogles

+0

Chỉ cần làm rõ, lý do tôi đã sử dụng f.is_valid() chỉ đơn giản là để làm cho câu hỏi ngắn gọn hơn. Sử dụng hàm f.save() không thành công với một AttributeError trên trường clean_data, nó không tồn tại cho đến khi biểu mẫu hợp lệ hóa. Vì vậy, ngay cả khi tôi đang sử dụng mã _exactly_ vì nó nằm trong liên kết tôi đã đăng (sử dụng hàm f.save() thay vì f.is_valid()) thì nó vẫn không thành công. – oogles

3

Nếu bạn vẫn muốn xác thực đối tượng nằm trong cơ sở dữ liệu, bạn có thể tuần tự hóa đối tượng đó trước và sau đó tạo Biểu mẫu với nó.

from django.utils import simplejson 
from django.core.serializers import serialize 

(...) 

fields_dict = simplejson.loads(serialize('json', [obj]))[0]['fields'] 
form = forms.MyForm(fields_dict) 
if form.is_valid 

Đây có lẽ không phải là cách tốt nhất để làm điều đó nhưng là người duy nhất mà tôi đã tìm thấy để có được một hình thức ràng buộc từ một mô hình. Tôi cần nó vì tôi muốn xác thực dữ liệu hiện tại trong cơ sở dữ liệu. Tôi tạo ra một câu hỏi vì tôi không nghĩ rằng đây là cách tốt nhất để làm việc đó:

Transform an unbound form to a bound one?

+2

Tôi đã bỏ lỡ toàn bộ "ràng buộc dữ liệu đến hình thức" điều, đó là những gì bạn đang đạt được với serialization . Tôi tin rằng django.forms.models.model_to_dict Django sẽ tốt hơn so với serialization nói mặc dù - xem câu trả lời của tôi cho câu hỏi của bạn: [link] (http://stackoverflow.com/questions/8993749/transform-an-unbound-form-to -a-ràng buộc-một # 8996585). – oogles

0

Đây không phải là một giải pháp cho OP, nhưng nó là dành cho tiêu đề bài, mà là khá cao trong Google. Vì vậy, tôi sẽ đăng nó anyway, từ here:

Nếu bạn đã đưa ra yêu cầu.POST đến biểu mẫu của bạn bằng cách sử dụng request.POST or None, nhưng nó vẫn không hợp lệ mà không có lỗi, hãy kiểm tra xem không có bất kỳ chuyển hướng nào đang diễn ra. Chuyển hướng mất dữ liệu POST của bạn và biểu mẫu của bạn sẽ không hợp lệ mà không có lỗi vì nó không bị ràng buộc.