2012-11-21 4 views
5

Ich habe ein Django-Projekt, mit 2 Modellen, Structure und Bracket, die Bracket hat einen ForeignKey zu einer Struktur (d. H. Eins-zu-viele, eine Struktur hat viele Brackets). Ich habe eine TabularInline für die Admin-Site erstellt, so dass es eine Tabelle von Klammern auf der Struktur geben würde. Ich habe eine benutzerdefinierte mit einigen einer benutzerdefinierten clean Methode Formset einige zusätzliche Validierung zu tun, können Sie nicht eine Halterung, die auf der gleichen Struktur mit einem anderen Bracket Konflikte usw.Testing InlineFormset saubere Methoden

Der Admin wie folgt aussieht:

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

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

die BracketInlineFormset hat gerade die saubere Methode:

Das alles funktioniert, und die Validierungsarbeiten.

Nun möchte ich jedoch einen Unittest schreiben, um meine komplexe Formset-Validierungslogik zu testen.

Mein erster Versuch bekannt-gute Werte zu validieren ist:

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()) 

jedoch, das nicht funktioniert und löst die Ausnahme:

====================================================================== 
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' 

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

Die Django documentation (für formset Validierung) impliziert, man kann mach das.

Wie funktioniert das nicht? Wie teste ich die benutzerdefinierte clean()/Validierung für mein Inline-Formularsatz?

+0

Was ist die Erklärung von BracketInlineFormset aussehen? –

+0

@JohnMee Inline-Formularsatzcode zur Frage hinzugefügt – Rory

Antwort

4

Sie können die Methode inlineformset_factory von django.forms.models verwenden, um ein benutzerdefiniertes Inline-Formset zu erstellen. Diese Methode legt den fk-Wert basierend auf der übergeordneten Klasse fest, die an das Formularset übergeben wird.

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()) 

Hinweis die formset=BracketInlineFormset Parameter während der formset mit der Fabrik zu bauen.

Referenz: Django Docs