Как отправить идентификатор пользователя через формы
Я хочу отображать информацию в разделе профиля после получения информации от пользователя
Но я не могу отправить идентификатор пользователя через формы
Мои модели:
class PersonalInformation(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE, related_name='information')
full_name = models.CharField(max_length=40)
email = models.EmailField(blank=True, null=True)
creation_date = models.DateTimeField(auto_now_add=True)
def __str__(self):
return self.full_name
Мои формы:
class PersonalInformationForm(forms.ModelForm):
user = forms.IntegerField(required=False)
class Meta:
model = PersonalInformation
fields = "__all__"
Мои взгляды:
class PersonalInformationView(View):
def post(self, request):
form = PersonalInformationForm(request.POST)
if form.is_valid():
personal = form.save(commit=False)
personal.user = request.user
personal.save()
return redirect('profile:profile')
return render(request, 'profil/profile-personal-info.html', {'information': form})
def get(self, request):
form = PersonalInformationForm(request.POST)
return render(request, 'profil/profile-personal-info.html', {'information': form})
Сделайте поле нередактируемым, чтобы оно не появлялось в форме:
from django.conf import settings
class PersonalInformation(models.Model):
user = models.OneToOneField(
settings.AUTH_USER_MODEL,
editable=False,
on_delete=models.CASCADE,
related_name='information',
)
full_name = models.CharField(max_length=40)
email = models.EmailField(blank=True, null=True)
creation_date = models.DateTimeField(auto_now_add=True)
def __str__(self):
return self.full_name
В представлении используйте CreateView
, это значительно сократит количество шаблонного кода:
from django.contrib.auth.mixins import LoginRequiredMixin
from django.urls import reverse_lazy
class PersonalInformationView(LoginRequiredMixin, CreateView):
form_class = PersonalInformationForm
success_url = reverse_lazy('profile:profile')
template_name = 'profil/profile-personal-info.html'
def form_valid(self, form):
form.instance.user = request.user
return super().form_valid(form)
При этом в модели User
по умолчанию уже есть поля для имен и адресов электронной почты, так что вы, по сути, дублируете логику.
Note: You can limit views to a class-based view to authenticated users with the
LoginRequiredMixin
mixin [Django-doc].
Note: It is normally better to make use of the
settings.AUTH_USER_MODEL
[Django-doc] to refer to the user model, than to use theUser
model [Django-doc] directly. For more information you can see the referencing theUser
model section of the documentation.