Как отправить идентификатор пользователя через формы

Я хочу отображать информацию в разделе профиля после получения информации от пользователя

Но я не могу отправить идентификатор пользователя через формы

Мои модели:

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 the User model [Django-doc] directly. For more information you can see the referencing the User model section of the documentation.

Вернуться на верх