python - tipos - post django
Diferencia entre Django ModelForm y los métodos de guardado de instancia de modelo (2)
Estoy tratando de entender la diferencia entre el método de guardado ModelForm de Django y el guardado de la instancia del Modelo directamente.
Personalmente, encuentro el ahorro directamente más intuitivo y muestra más claramente cuándo se guardan los datos. Además, si necesito modificar la instancia antes de guardar, entonces tengo que usar el método Guardar modelo como lo explica la documentación de Django aquí .
Entonces, una vez que se valida la forma, ¿cuál es la diferencia? ¿Habría alguna diferencia si el formulario utilizara varios modelos o algún otro caso de uso más complejo?
Estoy usando Django versión 1.4 si eso importa. A continuación, se muestra un código que muestra cómo tiendo a guardar datos de formularios validados.
¡Gracias por adelantado!
# models.py
class Project(models.Model):
project_name = models.CharField(unique=True, null=False, blank=False)
# views.py
def add_project(request):
if request.method == ''POST'':
project = Project()
form = ProjectForm(request.POST, instance=project)
if form.is_valid():
project.save() ### <-- project.save() vs form.save() ###
return HttpResponseRedirect(reverse(''view_project'', args=(project.id,)))
else:
form = ProjectForm()
return render_to_response(
''add_project.html'',
{
''form'': form,
},
context_instance=RequestContext(request)
)
# forms.py
class ProjectForm(ModelForm):
class Meta:
model = Project
En la línea comentada que tienes, project.save()
simplemente no hará nada. La instancia no se ha actualizado con los datos del formulario, simplemente es la instancia vacía que creó dos líneas antes. La única forma de actualizar una instancia existente es guardando su formulario.
ModelForm.save()
devuelve un objeto guardado de los datos que se colocaron en el formulario, Model.save()
devuelve un objeto de los datos con los que se inicializó el objeto o valores que se establecieron después de su creación. Entonces, cuando se trata de obtener los datos de lo que el usuario ingresó en el formulario a un objeto persistente, tiene más sentido llamar a ModelForm.save()
lugar de pasar por el trabajo de validar los datos usted mismo, inicializando el objeto y luego guardando porque todo el trabajo lo maneja ModelForm
.