Django表单初始化相关问题的处理怎样做
Admin 2022-06-13 群英技术资讯 1169 次浏览
在实际应用中,我们有时候会遇到“Django表单初始化相关问题的处理怎样做”这样的问题,我们该怎样来处理呢?下文给大家介绍了解决方法,希望这篇“Django表单初始化相关问题的处理怎样做”文章能帮助大家解决问题。先说明一下问题的由来:
Django的模型中经常会用ForeignKey来关联其他表格数据
class MeasureTask(models.Model):
taskname = models.CharField(max_length=LEN_FULLNAME, verbose_name="任务名称")
road = models.ForeignKey(Road, on_delete=models.CASCADE, verbose_name="设计路段")
# 路面层,附加一个参数 ,指定这个层的厚度,相对于底层的厚度
# road_level = models.ForeignKey(RoadLevel, on_delete=models.CASCADE, verbose_name="路面层")
level_thick = models.IntegerField(default=0, verbose_name="层厚(mm)")
# ...
使用Django的ModelForm转化为表单代码如下:
class MeasureTaskNewForm(forms.ModelForm):
class Meta:
model = MeasureTask
fields = ('taskname', 'staff', 'start_mileage', 'end_mileage',
'road', 'level_thick', 'step', 'equip', 'comment')
如果不做进一步处理,在网页中使用这个From时,关联字段会自动转化为一个select控件,里面包含了所有选项,如下图:

实际应用时,需要对关联的字段做一些选择过滤。期望的结果如下:

在From类中设置一个初始化函数:
class MeasureTaskNewForm(forms.ModelForm):
class Meta:
model = MeasureTask
fields = ('taskname', 'staff', 'start_mileage', 'end_mileage',
'road', 'level_thick', 'step', 'equip', 'comment')
# 对参数作初始化设置,导致返回之后的Form验证失败
def __init__(self, road_choices=None, *args, **kwargs):
super(MeasureTaskNewForm, self).__init__(*args, **kwargs)
if road_choices:
self.fields['road'].choices = road_choices
应用这个类的方式如下,注意传入参数的数据类型,
# 对关联数据过滤
roads = Road.objects.filter(project=p_item)
# 生成值,分别对应于 html 中 select->option 设置
choices = roads.values_list('id', 'name')
dataform = MeasureTaskNewForm(road_choices=choices)
# dataform = MeasureTaskNewFormShadow()
return render(request, "mdata/html/measure_task_add.html", locals())
生成的html代码:
<select name="road" id="id_road" class="form-control"> <option value="1">北四环主线</option> <option value="5">匝道A</option> </select>
到这里生成的表单页面没有问题了,但是表单提交返回时如果还是用这个From来接收Request数据,则会出现数据校验失败的问题
if request.method == "POST":
dataform = MeasureTaskNewForm(request.POST)
# 这里将出现校验失败的问题
if dataform.is_valid():
dataform.save()
return redirect('mdata:measure_task', pid=p_item.id)
为了解决这个问题,另外做了一个没有初始化函数的表单类来接收数据.
# 影子表单模型
class MeasureTaskNewFormShadow(forms.ModelForm):
class Meta:
model = MeasureTask
fields = ('taskname', 'staff', 'start_mileage', 'end_mileage',
'road', 'level_thick', 'step', 'equip', 'comment')
if request.method == "POST":
dataform = MeasureTaskNewFormShadow(request.POST)
if dataform.is_valid():
dataform.save()
return redirect('mdata:measure_task', pid=p_item.id)
感觉这里应该有更好的方法,尝试对Form的初始化函数做了一些修改,但是没有成功。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
python循环的分类、语句及简单的应用是怎样的?在Python中,循环分为while和for两种,最终实现效果相同。下文的讲解详细,步骤过程清晰,对大家进一步学习和理解相关知识有一定的帮助。有这方面学习需要的朋友就继续往下看吧!
这篇文章主要介绍了如何用 Python 子进程关闭 Excel 自动化中的弹窗,帮助大家更好的理解和学习使用python,感兴趣的朋友可以了解下
这篇文章主要介绍了Python numpy之线性代数与随机漫步,线性代数,矩阵计算,优化与内存;比如矩阵乘法,分解,行列式等数学知识,是所有数组类库的重要组成部分
这篇文章主要介绍了Python爬虫Xpath定位数据的方法,第一种方法直接右键,将文章路径复制下来点击Copy full Xpath,方法二使用@制定标签属性,搜索指定位置,每种方法给大家介绍的非常详细,需要的朋友可以参考下
这篇文章主要介绍了python实现三次密码验证的示例,帮助大家更好的理解和学习使用python,感兴趣的朋友可以了解下
成为群英会员,开启智能安全云计算之旅
立即注册关注或联系群英网络
7x24小时售前:400-678-4567
7x24小时售后:0668-2555666
24小时QQ客服
群英微信公众号
CNNIC域名投诉举报处理平台
服务电话:010-58813000
服务邮箱:service@cnnic.cn
投诉与建议:0668-2555555
Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 ICP核准(ICP备案)粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008