2010-09-07 6 views
24

Tengo algunas líneas en uno de mis modelos de administrador que tienen valores predeterminados que probablemente no necesiten cambiarse cuando se agrega una nueva instancia con "Agregar otro ...". Lamentablemente, django no reconocerá estos objetos en línea como nuevos a menos que haya cambiado algún valor. Esto me obliga a agregar una línea, cambiar un valor arbitrario, guardar, cambiar el valor y guardar de nuevo para alcanzar el efecto deseado.Cómo forzar a guardar un administrador de django "vacío"/sin cambios en línea?

La única solución que he encontrado hasta ahora es agregar un campo oculto 'changed' que se rellenaría mediante java-script al agregar una nueva línea. Como esto se siente muy harto, espero que haya una solución más elegante.

Cualquier idea sería muy apreciada.

Gracias, Daniel.

Respuesta

45

Me tomó bastante tiempo averiguarlo, pero en realidad es realmente simple.

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 Esto es bastante obvio después de todo. –

+4

No diría obvio, ¡pero definitivamente simple y asombroso! –

3

respuesta @ Daniel es grande, sin embargo, va a tratar de guardar la instancia que ya está creado nunca si se hacen cambios, lo que no es necesario, es mejor usarlo como:

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) 
Cuestiones relacionadas