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).
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:
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.