2011-12-11 16 views
16

Tengo un problema con los usuarios registrados y un Django ModelForm. Tengo una clase llamada _Animal_ que tiene ForeignKey a User y algunos datos relacionados con el animal como edad, raza, etc.Usando request.user con Django ModelForm

Un usuario puede agregar Animales a la base de datos y tengo que rastrear el autor de cada animal, así que tengo que agregar el request.user que se registra cuando el usuario crea una instancia animal.

models.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 editorial en la forma, y ​​presentar al usuario conectado al golpear 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.

views.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) 
+0

Es el 'User' una instancia de' django.contrib.auth.models'? – shailenTJ

Respuesta

31

Sólo tiene que excluirlo de la forma, a continuación, establecer 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 inmediatamente después de la redirección - no es necesario si usted lo deja salir, ejecución caerán a través de las dos líneas al final de la vista, que son idénticos)

+0

Muchas gracias Daniel. Las últimas dos líneas deberían estar sangradas por cierto. – amb

8

Otra forma (ligeramente más corto):.
Es necesario excluir el campo, así:

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

continuación, en la vista:

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