2009-09-03 13 views

Respuesta

2

Una forma es conectar con 'la señal de su modelo de línea `pre_save:

from django.db.models.signals import pre_save 
from your_app.models import YourModel 

def callback(sender, **kwargs): 
    # 'instance' is the model instance that is about to be saved, 
    # so you can do whatever you want to it. 
    instance.field = new_value 

pre_save.connect(callback, sender=YourModel) 

, pero no estoy seguro de por qué no se puede simplemente reemplazar el método save, que casi siempre es un mejor enfoque.

+0

+1 ¡Para señalar que es mejor anular el método 'save()' en el Modelo! – Caumons

9

para personalizar el ahorro de inlines, puede anular la FormSet

class SomeInlineFormSet(BaseInlineFormSet): 
    def save_new(self, form, commit=True): 
     return super(SomeInlineFormSet, self).save_new(form, commit=commit) 

    def save_existing(self, form, instance, commit=True): 
     return form.save(commit=commit) 

class SomeInline(admin.StackedInline): 
    formset = SomeInlineFormSet 
    # .... 

Tenga en cuenta que la save_new() sólo utiliza el formulario para obtener los datos, que no permite que el ModelForm cometen los datos. En cambio, construye el modelo en sí mismo. Esto le permite insertar la relación principal ya que no existen en el formulario. Es por eso que anular form.save() no funciona.

En el caso de inlines genéricos, el método form.save() nunca es llamado, y form.cleaned_data se utiliza en lugar de obtener todos los valores, y Field.save_form_data() se utiliza para almacenar los valores de la instancia de modelo.


FYI, algunos consejos generales para resolver este tipo de cosas; es realmente valioso tener un IDE (o tal vez una configuración vim o una configuración Sublime) que permita saltar a las definiciones de los símbolos de manera muy fácil. El código anterior fue resuelto saltando al código en línea/formset y ver qué está sucediendo. En el caso de PyCharm, eso funciona manteniendo presionado Command (o Ctrl) y haciendo clic en el símbolo. Si es usuario de vim, ctags podría hacer algo similar para usted.

Cuestiones relacionadas