Tengo un problema con la presentación de un formulario a una URL diferente utilizando los atributos de "acción" del formulario. Tengo una vista detallada (como se muestra a continuación) que muestra información sobre un maestro en particular, como una página de perfil y la plantilla HTML, los HTML Renderers contienen un formulario que se manejaría con otra URL / vista.

Views.py

class TeacherDetail(DetailView):
    model = Teacher
    template_name = ‘teacher_info.html’

User_info.html #showing el formulario

<form method="POST" action="/inter/account/start/">{%csrf_token%}
<input type="hidden" name="teacher" id="object.id" value="{{object}}">
<button type="submit" name="invite">Invite Teacher</button>
</form>

Mi intención es enviar también el objeto a sí mismo de esta vista detallada en particular a la URL, se enviaría el formulario porque sería necesario para la validación de la forma.

Ver # Donde se ha enviado el formulario a

class MakeInvitation(CreateView):
    model = Invitation
    fields = []

    def form_valid(self, form):
        form.instance.inviter = self.request.user.student
        form.instance.invitee = self.request.POST['teacher']
        return super().form_valid(form)

El modelo "Invitación" tiene solo dos campos, invitadores e invitados. Hice el formulario.Instance.Inviter Ser el usuario actual del estudiante y el form.InStance.Invitee (una tecla extranjera a un modelo de maestro) para ser el maestro cuya página de perfil era de donde venía el formulario, así que estoy tratando de usar Solicitud.Post para obtener el objeto del formulario en la página de detalle.

Recibo un (ValueError: No se puede asignar "PRUEBA UNO '": "Invitation.Invitee" debe ser una instancia de "maestro").

0
Ibrahim 14 jul. 2019 a las 15:21

1 respuesta

La mejor respuesta

Hay algunos problemas aquí.

No está utilizando ninguna de las funciones de la vista o el formulario. Debe agregar invitee a la lista de campos, y establecer el nombre de su campo oculto apropiadamente. Además, el valor del campo debe ser la identificación del maestro, no su representación de cadena. Así que la línea de plantilla es:

<input type="hidden" name="invitee" value="{{ object.id }}

Y la vista puede ser:

class MakeInvitation(CreateView):
    model = Invitation
    fields = ['invitee']

    def form_valid(self, form):
        form.instance.inviter = self.request.user.student
        return super().form_valid(form)
0
Daniel Roseman 14 jul. 2019 a las 12:38