Автоматическое связывание формы и пользователя с помощью поля 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()}