2012-11-21 9 views
5

Ho un progetto Django, con 2 modelli, uno Structure e Bracket, il Bracket ha una Chiave Straniera in una Struttura (vale a dire uno-a-molti, una Struttura ha molte Parentesi). Ho creato un TabularInline per il sito di amministrazione, in modo che ci fosse una tabella di parentesi sulla struttura. Ho aggiunto una consuetudine formset con un po 'un metodo personalizzato clean a fare un po' di validazione in più, non si può avere una staffa che è in conflitto con un altro staffa sulla stessa struttura eccTesting InlineFormset metodi puliti

L'amministratore si presenta così:

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

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

il BracketInlineFormset deve solo il metodo pulito:

che tutte le opere, e le opere di convalida.

Tuttavia ora voglio scrivere alcuni unittest per testare la mia logica di validazione formset complessa.

Il mio primo tentativo di convalidare i valori-buoni noti è:

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

tuttavia che non funziona e genera l'eccezione:

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

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

Il Django documentation (per formset convalida) implica uno può Fai questo.

Come mai questo non funziona? Come posso testare la clean()/validazione personalizzata per il mio formset in linea?

+0

Qual è la dichiarazione di BracketInlineFormset assomiglia? –

+0

@JohnMee codice formset inline aggiunto alla domanda – Rory

risposta

4

È possibile utilizzare il metodo inlineformset_factory da django.forms.models per creare un formset in linea personalizzato. Questo metodo imposta il valore fk sul formset in base alla classe genitore passata a esso.

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

Nota il parametro formset=BracketInlineFormset, mentre la costruzione del formset con la fabbrica.

Riferimento: Django Docs