2012-11-21 35 views
5

Tôi có một dự án Django, với 2 mô hình, StructureBracket, Giá đỡ có khóa ngoại cấu (tức là một-nhiều, một Cấu trúc có nhiều Chân đế). Tôi đã tạo ra một TabularInline cho trang quản trị, để có một bảng Chân đế trên Cấu trúc. Tôi đã thêm một tùy chỉnh formset với một số phương pháp tùy chỉnh clean để làm thêm một số xác nhận, bạn không thể có một giá đỡ xung đột với Bracket khác trên cấu trúc tương tự, vvThử nghiệm phương thức làm sạch InlineFormset

Các admin trông như thế này:

class BracketInline(admin.TabularInline): 
    model = Bracket 
    formset = BracketInlineFormset 

class StructureAdmin(admin.ModelAdmin): 
    inlines = [ 
     BracketInline 
    ] 
admin.site.register(Structure, StructureAdmin) 

các BracketInlineFormset chỉ có phương pháp làm sạch:

Đó là tất cả các công trình, và các công trình xác nhận.

Tuy nhiên bây giờ tôi muốn viết một số unittest để kiểm tra logic xác nhận formset phức tạp của tôi.

nỗ lực đầu tiên của tôi để xác nhận giá trị được biết đến-tốt là:

data = {'form-TOTAL_FORMS': '1', 'form-INITIAL_FORMS': '0', 'form-MAX_NUM_FORMS': '', 'form-0-field1':'good-value', … } 
formset = BracketInlineFormset(data) 
self.assertTrue(formset.is_valid()) 

Tuy nhiên điều đó không làm việc và làm tăng ngoại lệ:

====================================================================== 
ERROR: testValid (appname.tests.StructureTestCase) 
---------------------------------------------------------------------- 
Traceback (most recent call last): 
    File "/paht/to/project/tests.py", line 494, in testValid 
    formset = BracketInlineFormset(data) 
    File "/path/to/django/forms/models.py", line 672, in __init__ 
    self.instance = self.fk.rel.to() 
AttributeError: 'BracketInlineFormset' object has no attribute 'fk' 

---------------------------------------------------------------------- 

Các Django documentation (ví formset xác nhận) ngụ ý người ta có thể làm cái này.

Cách tính năng này không hoạt động? Làm cách nào để kiểm tra tùy chỉnh()/xác nhận hợp lệ cho biểu mẫu nội tuyến của tôi?

+0

Tuyên bố của BracketInlineFormset trông như thế nào? –

+0

@JohnMee mã định dạng nội tuyến được thêm vào câu hỏi – Rory

Trả lời

4

Bạn có thể sử dụng phương thức inlineformset_factory từ django.forms.models để tạo bộ biểu mẫu nội tuyến tùy chỉnh. Phương thức này đặt giá trị fk cho formset của bạn dựa trên lớp cha được truyền cho nó.

structure = StructureFactory() #foreign key 
data = {'form-TOTAL_FORMS': '1', 'form-INITIAL_FORMS': '0', 'form-MAX_NUM_FORMS': '', 'form-0-field1':'good-value', … } 
BIFormset = inlineformset_factory(Structure, Bracket, formset=BracketInlineFormset) 
formset = BIFormset(data, prefix='form', instance=structure) 
self.assertTrue(formset.is_valid()) 

Lưu ý tham số formset=BracketInlineFormset khi xây dựng bộ định hình với nhà máy.

Tham chiếu: Django Docs

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