widgets update formularios form fields example ejemplos avanzados python django django-forms django-views

python - update - modelform django



Usando request.user con Django ModelForm (3)

Estoy teniendo un problema con los usuarios registrados y un Django ModelForm . Tengo una clase llamada _Animal_ que tiene una ForeignKey to User y algunos datos relacionados con el animal, como la edad, la raza, etc.

Un usuario puede agregar Animales a la base de datos y tengo que rastrear al autor de cada animal, por lo que debo agregar la solicitud.usuario que se registra cuando el usuario crea una instancia de animal.

modelos.py

class Animal(models.Model): name = models.CharField(max_length=300) age = models.PositiveSmallIntegerField() race = models.ForeignKey(Race) ... publisher = models.ForeignKey(User) def __unicode__(self): return self.name class AnimalForm(ModelForm): class Meta: model = Animal

El objetivo principal es ocultar el campo del editor en el formulario y enviar el usuario registrado al presionar el botón Guardar.

Puedo capturar al usuario actual en la vista usando initial , pero lo que también quiero es no mostrar el campo.

vistas.py

@login_required def new_animal(request): if request.method == "POST": form = AnimalForm(request.POST) if form.is_valid(): form.save() return redirect(''/'') else: variables = RequestContext(request, {''form'': form}) return render_to_response(''web/animal_form.html'', variables) else: form = AnimalForm(initial={''publisher'': request.user}) variables = RequestContext(request, {''form'': form}) return render_to_response(''web/animal_form.html'', variables)


Lo añadiría directamente al formulario:

class AnimalForm(ModelForm): class Meta: model = Animal exclude = (''publisher'',) def save(self, commit=True): self.instance.publisher = self.request.user return super().save(commit=commit)

En mi opinión, esta es la versión más limpia y puede utilizar el formulario en diferentes vistas.


Otra forma (un poco más corta):
Necesitas excluir el campo también:

class AnimalForm(ModelForm): class Meta: model = Animal exclude = (''publisher'',)

Luego en la vista:

animal = Animal(publisher=request.user) form = AnimalForm(request.POST, instance=animal) if form.is_valid(): animal.save()


Solo debe excluirlo del formulario y luego configurarlo en la vista.

class AnimalForm(ModelForm): class Meta: model = Animal exclude = (''publisher'',)

... y en la vista:

form = AnimalForm(request.POST) if form.is_valid(): animal = form.save(commit=False) animal.publisher = request.user animal.save()

(Tenga en cuenta también que la primera cláusula else , las líneas que siguen inmediatamente a la redirección, no es necesaria. Si la omite, la ejecución se ubicará en las dos líneas al final de la vista, que son idénticas).