python - personalizados - ¿Cuál es la diferencia entre estas dos formas de anular el método save() en un Django ModelForm?
formularios avanzados django (2)
El primero creará una instancia del modelo, sin guardarlo, luego puede agregar algún valor (es obligatorio o no) y activar manualmente el guardado en esa instancia.
El segundo guardará un campo en ModelForm (no en la instancia real de su modelo) y luego creará + save instance de su modelo.
Si en el segundo solo está configurando el valor en el campo del formulario que corresponde al campo del modelo editado en el primer ejemplo, eso funcionará casi de la misma manera.
¿Por qué casi? En el segundo ejemplo, debe tener ese campo de formulario dentro de su clase de formulario; en el primer ejemplo, no. Si ese campo es obligatorio y se ha dejado vacío, el segundo ejemplo no se validará.
Dicho esto, el primer ejemplo puede agregar o cambiar campos en su modelo que no aparecieron en el formulario, el segundo ejemplo solo puede modificar los campos que se han especificado dentro de la clase de formulario.
Me he encontrado con dos métodos para hacer esto. La respuesta aceptada aquí sugiere :
def save(self, *args, **kwargs):
instance = super(ModelClass, self).save(commit=False)
instance.my_stuff = manual_value
instance.save()
Pero lo siguiente, que se encuentra aquí , parece más elegante:
def save(self, *args, **kwargs):
self.my_stuff = manual_value
super(ModelClass, self).save(*args, **kwargs)
¿Hay alguna razón para elegir una sobre la otra, salvo que esta última sea una línea menos, como una razón para ejecutar primero el elemento primario save()
?
Los dos ejemplos están haciendo cosas diferentes. El primero es guardar el método de guardar del formulario modelo , el segundo está anulando el método de guardar del modelo .
Solo tiene sentido anular el método del modelo si desea que se establezca el valor cada vez que se guarda el modelo. Si la actualización del campo está relacionada con el formulario, entonces, anular el método de guardar del formulario es lo correcto.
En el método de guardar del formulario modelo, primero debe llamar a save(commit=False)
para obtener la instancia. No me preocuparía que sea poco elegante, es un patrón muy común en Django y está documentado aquí .