es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Pasando un Usuario Autenticado al Modelo Vista en Django

Estoy creando un modelo de perfil que necesita pasar el usuario autenticado actual como clave externa. Si no excluyo el campo de usuario, puedo seleccionar entre todos los usuarios, pero necesito ocultar este campo y pasar automáticamente al usuario autenticado actual cuando se envíe el formulario. El usuario agregará otros campos como nombre, fecha de nacimiento, etc. al modelo. No puedo entender cómo agregar el usuario al formulario del modelo. Lo que tengo en mi archivo views.py (abajo) es lo más cerca que he podido llegar.

Modelos

class Profile(models.Model):
    user = models.ForeignKey(
        get_user_model(),
        on_delete=models.CASCADE
    )
    first_name = models.CharField(max_length=200, blank=True)
    last_name = models.CharField(max_length=200, blank=True)
    dob = models.DateField(blank=True)
    profile_photo = models.ImageField(upload_to='profile_photos/', blank=True)

    def __str__(self):
        return self.first_name

    def get_absolute_url(self):
        return reverse('home')

Vistas

class ProfileCreateView(LoginRequiredMixin, generic.CreateView):

    model = Profile
    template_name = 'account/profile_creation.html'
    fields = ['first_name', 'last_name', 'dob', 'profile_photo']
    login_url = 'account_login'

    def form_valid(self, form):
        user = self.request.user
        self.object = form.save(commit=False)
        self.object.save()
        return super(ProfileCreateView, self).form_valid(form)

Formas

class CustomProfileForm(forms.Form):

    class Meta:
        model = Profile

El error que estoy obteniendo:

null value in column “user_id” violates not-null constraint
DETAIL: Failing row contains (16, first name, last name, dob, , null).

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para pasar automáticamente el usuario autenticado actual como clave foránea para el modelo Perfil cuando se envía el formulario, puedes realizar los siguientes cambios:

    1. Modifica la clase ProfileCreateView para usar un formulario personalizado que excluya el campo de usuario y luego establece manualmente el campo de usuario como el usuario autenticado actual en el método form_valid:
    class ProfileCreateView(LoginRequiredMixin, generic.CreateView):
        model = Profile
        template_name = 'account/profile_creation.html'
        form_class = CustomProfileForm
        login_url = 'account_login'
    
        def form_valid(self, form):
            form.instance.user = self.request.user
            return super().form_valid(form)
    
    1. Crea un formulario personalizado que excluya el campo de usuario:
    class CustomProfileForm(forms.ModelForm):
        class Meta:
            model = Profile
            exclude = ['user']
    

    Este formulario se utilizará en la clase ProfileCreateView en lugar del formulario predeterminado generado por la clase CreateView.

    Con estos cambios, el campo de usuario se establecerá automáticamente como el usuario autenticado actual cuando se envíe el formulario, y el campo de usuario no será visible en el formulario.

Comments are closed.