2010-09-07 6 views
24

Ho alcuni inline in uno dei miei modelli di amministrazione che hanno valori predefiniti che probabilmente non dovranno essere modificati quando si aggiunge una nuova istanza con "Aggiungi un altro ...". Sfortunatamente django non riconoscerà questi inline come nuovi oggetti a meno che qualche valore non sia cambiato. Questo mi costringe ad aggiungere un inline, modificare un valore arbitrario, salvare, cambiare il valore indietro e salvare di nuovo per raggiungere l'effetto desiderato.Come forzare-salvare un admin "vuoto"/invariato di django in linea?

L'unica soluzione che ho escogitato finora è quella di aggiungere un campo "cambiato" nascosto che verrà popolato tramite java-script quando si aggiunge una nuova in linea. Dato che questo si sente molto hacker, spero che ci sia una soluzione più elegante.

Qualsiasi idea sarebbe molto apprezzata.

Grazie, Daniel.

risposta

45

Mi ci è voluto un po 'di tempo per capire ma in realtà è davvero semplice.

from django.contrib import admin 
from django.forms.models import BaseInlineFormSet, ModelForm 

class AlwaysChangedModelForm(ModelForm): 
    def has_changed(self): 
     """ Should returns True if data differs from initial. 
     By always returning true even unchanged inlines will get validated and saved.""" 
     return True 

class CheckerInline(admin.StackedInline): 
    """ Base class for checker inlines """ 
    extra = 0 
    form = AlwaysChangedModelForm 
+1

+ 1 Questo è abbastanza ovvio dopo tutto. –

+4

Non direi ovvio, ma sicuramente semplice e fantastico! –

3

@ Daniel risposta è grande, ma cercherà di salvare l'istanza che è già stato creato mai se non viene effettuata alcuna modifica, che non è necessario, meglio usarlo come:

class AlwaysChangedModelForm(ModelForm): 
    def has_changed(self, *args, **kwargs): 
     if self.instance.pk is None: 
      return True 
     return super(AlwaysChangedModelForm, self).has_changed(*args, **kwargs)