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).