Django forms如何设置字段对应数据库当前值作为初始值
解决方案
以下是两种可行的实现方式,可直接修改对应代码完成需求:
方案1:基于现有普通Form修改
核心逻辑是在GET请求加载表单时,将用户已存储的字段值作为初始值传入表单实例。
1. 修改views.py代码
@login_required def customer_panel_info_view(request): # @login_required装饰器已保证用户已登录,可直接取当前登录用户 customer = request.user if request.method == 'POST': # 提交表单时用用户提交的数据实例化表单 info_form = CustomerInfoForm(request.POST) if info_form.is_valid(): # 赋值保存字段 customer.first_name = info_form.cleaned_data.get("first_name") customer.last_name = info_form.cleaned_data.get("last_name") # 其余字段按相同规则赋值即可 customer.save() else: # 页面首次加载时,传入数据库已有值作为表单初始值 initial_data = { "first_name": customer.first_name, "last_name": customer.last_name, # 其余字段按格式补充即可 } info_form = CustomerInfoForm(initial=initial_data) context = { "info_form": info_form, } return render(request, "panel/info.html", context)
2. 修复模板渲染语法
你原模板中{% info_form %}是错误的模板标签写法,需改为变量输出语法渲染表单:
<form action="" method="post"> {% csrf_token %} {{ info_form.as_p }} <button type="submit" class="btn btn-success">提交</button> </form>
如果需要自定义字段样式,可手动遍历每个字段渲染。
方案2(更推荐):改用ModelForm简化逻辑
由于你的表单字段直接对应用户模型字段,使用Django自带的ModelForm可以省去手动写字段、手动赋值保存的重复代码,自动支持初始值填充。
1. 修改forms.py代码
from django import forms from django.contrib.auth import get_user_model User = get_user_model() class CustomerInfoForm(forms.ModelForm): class Meta: model = User # 把所有需要展示的字段都列在这里即可 fields = ['first_name', 'last_name', 'gender', 'birth_date'] # 按需配置字段label labels = { 'first_name': 'Firstname', 'last_name': 'Lastname', } # 按需配置控件,不需要修改默认控件的字段可以不写 widgets = { 'first_name': forms.TextInput(), 'last_name': forms.TextInput(), }
2. 修改views.py代码
@login_required def customer_panel_info_view(request): customer = request.user if request.method == 'POST': info_form = CustomerInfoForm(request.POST, instance=customer) if info_form.is_valid(): # 无需手动赋值每个字段,直接保存即可 info_form.save() else: # 直接传入用户实例,ModelForm会自动读取已有值填充表单 info_form = CustomerInfoForm(instance=customer) context = { "info_form": info_form, } return render(request, "panel/info.html", context)
模板部分和方案1通用。
内容的提问来源于stack exchange,提问作者alumen-
相关产品推荐
相关产品推荐

