使用OneToOneField自动链接表单和用户



我已经创建了一个模型表单也使用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()}

相关内容

最新更新