Ver Mensaje Individual
  #7 (permalink)  
Antiguo 22/07/2011, 09:56
refreegrata
 
Fecha de Ingreso: agosto-2008
Mensajes: 198
Antigüedad: 15 años, 9 meses
Puntos: 27
Respuesta: claves foraneas en formularios Django

Espera un poco, no tienes que usar todos, yo te mostré 3 formas de hacerlo, pero tú deberías, si decides usar alguna de las alternativas, usar sólo una:

Opción 1:
----------
Cita:
Iniciado por refreegrata Ver Mensaje
Para filtrar el campo podrías pasar al formulario el usuario como parámetro y en una función como el init restringir el queryset:
Código:
self.fields['usuario'].queryset = Usuario.objects.filter(id=parametro.id)
Ahora con esto se te verá en la plantilla sí o sí como un select, quizás sería más agradable no mostrarlo, redifiniendo el widget como hidden y usando como initial el id del usuario.
Opción 2:
----------
Cita:
Iniciado por refreegrata Ver Mensaje
También podrías hacer esto, si el campo usuario puede ser nulo o blanco pasar como parámetro al usuario, dejar guardado como atributo del formulario a éste y en el método clean hacer algo como:
Código:
self.cleaned_data['usuario'] = usuario
Así daría lo mismo si muestras o no en el template el campo.
Opción 3
----------
Cita:
Iniciado por refreegrata Ver Mensaje
Otra cosa que podrías hacer es excluir el campo y después del save agregar el usuario:
Código:
registro = form.save()
registro.usuario = usuario
registro.save()
Aunque en este caso probablemente sería adecuado englobar la funcion en una transacción para asegurarte de no guardar, jamás, el formulario sin guardar también el usuario.
La última sólo funcionará si el campo no es obligatorio, ya que si no te va a dar un error al intentar el form.save(). Si mal no recuerdo, en ese caso podrías hacer algo como:
Código:
registro = form.save(commit=False)
registro.usuario = usuario
registro.save()
Así no se guardaría el registro hasta llegar hasta la línea registro.save().

Ahora para agregar un valor inicial en una función como el init puedes hacer algo como
Código:
self.fields['campo'].initial = valor
Saludos.

Última edición por refreegrata; 22/07/2011 a las 10:21