Django使用OneToOneField自动关联表单与用户及choices取值问题
Django问题解决方案
问题1:表单提交自动绑定当前登录用户
你不需要在后台手动关联用户,修改视图层逻辑即可实现自动绑定:
- 首先给视图添加登录校验装饰器,避免未登录用户访问时出现异常
- 表单验证通过后,使用
commit=False参数暂存表单数据,手动给user字段赋值当前登录用户后再执行保存操作
修改后的views.py对应代码如下:
from django.contrib.auth.decorators import login_required # 加登录装饰器,保证只有登录用户可以访问该视图 @login_required def add_information(request): if request.method == "POST": form = UserInformationForm(request.POST) if form.is_valid(): # 暂存数据不提交到数据库 info = form.save(commit=False) # 绑定当前登录用户 info.user = request.user # 正式提交到数据库 info.save() messages.success(request, 'Form submitted') else: form = UserInformationForm() return render(request, 'accounts/profile/add_information.html', {'form': form})
问题2:获取choices字段对应的展示标签
Django为所有设置了choices参数的模型字段,自动提供了get_字段名_display()内置方法,调用该方法即可直接拿到存储值对应的展示标签:
- 视图/逻辑层使用示例:
gender_label = user.userinformation.get_gender_display() # 此时gender_label的值就是"Male"或者"Female"
- 模板层使用示例:
<!-- 直接调用方法不需要加括号 --> <p>性别:{{ user.userinformation.get_gender_display }}</p>
可选优化
你当前的show_profile视图查询了所有用户的信息,如果是要做个人资料展示页,可以修改为仅查询当前登录用户的资料:
@login_required def show_profile(request): profile_info = UserInformation.objects.get(user=request.user) return render(request, 'accounts/profile/user_profile.html', {'profile_info': profile_info})
内容的提问来源于stack exchange,提问作者Kome Gognome
相关产品推荐
相关产品推荐

