Pregunta

Este problema es muy extraño y estoy esperando que alguien me puede ayudar.Por el bien del argumento, tengo un Autor modelo con ForeignKey relación con el Libro modelo.Cuando me visualización de un autor, me gustaría tener un ChoiceField que SÓLO muestra los libros asociados con el autor.Como tal, puedo reemplazar el AuthorForm.init() el método y puedo crear una Lista de opciones (tuplas) basado en una consulta que filtra los libros basados en la IDENTIFICACIÓN del autor.La tupla es un compuesto de la libreta de IDENTIFICACIÓN y el nombre del libro (es decir, (1, 'Moby Dick')).Esas "opciones" a continuación, se asignan a la ModelForm opciones de atributo.

Cuando el formulario se representa en la plantilla, el ChoiceField se muestra correctamente, listado de sólo aquellos libros asociados con el autor.

Esto es donde las cosas se ponen extrañas.

Cuando me guarde el formulario, aparece un ValueError (No se puede asignar en forma de "u'1'":Autor.libro" debe ser un Libro de instancia).Este error tiene sentido debido a la FK relación.Sin embargo, si puedo añadir una "impresión" instrucción para el código, no hay otros cambios y, a continuación, guardar el registro, funciona.El ValueError desaparezca por arte de magia.He intentado esto en un número de ocasiones, asegurando que no he inadvertidamente hizo otro cambio, y funciona cada vez.

¿Alguien sabe qué está pasando aquí?

¿Fue útil?

Solución

No del todo seguro de lo que está haciendo mal, pero lo mejor es que acaba de modificar el conjunto de consultas:

class ClientForm(forms.ModelForm):

    def __init__(self, *args, **kwargs):
        self.affiliate = kwargs.pop('affiliate')
        super(ClientForm, self).__init__(*args, **kwargs)
        self.fields["referral"].queryset = Referral.objects.filter(affiliate = self.affiliate)

    class Meta:
        model = Client

Lo anterior es directamente de uno de mis proyectos y funciona perfectamente para mostrar sólo los objetos Referencia relacionados con el afiliado pasado:

form = ClientForm(affiliate=request.affiliate)
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top