我已经创建了一个模型表单也使用OneToOneField字段链接到我的用户,我的问题是,我必须去管理部分手动选择用户使其工作。是否有可能将用户链接到自动提交的表单?这可能很愚蠢但是当我使用user。userinformation。gender来获取性别信息时我得到的是",是否有办法访问标签"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})
可以,您可以使用以下命令将UserInformation
中的.user
链接到登录用户:
from django.shorcuts import redirect
from django.contrib.auth.decorators importlogin_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)。
我认为你正在寻找的是UserInformationForm
实例的initial
属性,但你需要将user
添加到表单字段。
form = UserInformationForm(initial={"user":request.user.id})
如果您不希望用户看到/编辑信息,请考虑在ModelForm
中使用HiddenInput
小部件或设置禁用属性。
class UserInformationForm(forms.ModelForm):
class Meta:
model = UserInformation
fields = '__all__'
widgets = {'user': forms.HiddenInput()}