Автоматическое связывание формы и пользователя с помощью поля OneToOneField

Я создал модель формы, используя также поле OneToOneField, чтобы связать ее с моим пользователем, моя проблема в том, что я должен перейти в раздел администратора, чтобы вручную выбрать пользователя, чтобы это работало. Можно ли сделать так, чтобы пользователь привязывался к форме автоматически? Также это может быть глупо, но когда я использую user.userinformation.gender для получения информации о поле, я получаю ответ "m", есть ли способ получить доступ к метке "Male" вместо этого? Спасибо за помощь! Мой код:

models.py

class UserInformation(models.Model): 
   gender_choice = [('m', 'Male'),('f', 'Female')]  

   user = models.OneToOneField(User, blank=True,  null=True, on_delete=models.CASCADE)   
   first_name = models.CharField(max_length=120)
   last_name = models.CharField(max_length=120)
   gender = models.CharField(max_length=120, choices=gender_choice)    
   phone = models.CharField(max_length=10)
   email = models.EmailField()

forms.py

class UserInformationForm(forms.ModelForm):
   class Meta:
       model = UserInformation
       fields = ('first_name', 'last_name', 'gender', 'phone', 'email',)
views.py 
def add_information(request):
   if request.method == "POST":
       form = UserInformationForm(request.POST)        
       if form.is_valid():          
           form.save()
           messages.success(request, 'Form submitted')         
   else:
       form = UserInformationForm()
   return render(request, 'accounts/profile/add_information.html', {'form': form})

def show_profile(request):
   profile_info = UserInformation.objects.all()

   return render(request, 'accounts/profile/user_profile.html', {'profile_info': profile_info})

Да, вы можете связать .user из UserInformation с вошедшим пользователем с помощью:

from django.shorcuts import redirect
from django.contrib.auth.decorators import login_required

@login_required
def add_information(request):
   if request.method == 'POST':
       form = UserInformationForm(request.POST, request.FILES)
       if form.is_valid():          
           form.instance.user = request.user
           form.save()
           messages.success(request, 'Form submitted')
           return redirect('name-of-some-view')
   else:
       form = UserInformationForm()
   return render(request, 'accounts/profile/add_information.html', {'form': form})

Примечание: В случае успешного POST запроса, вы должны сделать redirect. [Django-doc] для реализации паттерна Post/Redirect/Get [wiki]. Это позволяет избежать повторения POST-запроса, когда пользователь обновляет браузер. браузер.


Примечание: Вы можете ограничить представления для аутентифицированных пользователей с помощью декоратора @login_required декоратора [Django-doc].

Я думаю, что то, что вы ищете, это атрибут initial экземпляра UserInformationForm, но вам нужно добавить user к полям формы.

form = UserInformationForm(initial={"user":request.user.id})

Если вы не хотите, чтобы пользователь видел/редактировал информацию, используйте виджет HiddenInput в вашем ModelForm или установите атрибут disabled.

class UserInformationForm(forms.ModelForm):
   class Meta:
       model = UserInformation
       fields = '__all__'
       widgets = {'user': forms.HiddenInput()}
Вернуться на верх