You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django使用OneToOneField自动关联表单与用户及choices取值问题

Django问题解决方案

问题1:表单提交自动绑定当前登录用户

你不需要在后台手动关联用户,修改视图层逻辑即可实现自动绑定:

  1. 首先给视图添加登录校验装饰器,避免未登录用户访问时出现异常
  2. 表单验证通过后,使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 16:06:01