Django表单外键选项初始化的问题及解决方法
作者:BH78 时间:2022-07-09 04:28:42
问题描述
先说明一下问题的由来:
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的初始化函数做了一些修改,但是没有成功。
参考资料
https://qastack.cn/programming/813418/django-set-field-value-after-a-form-is-initialized
http://hk.uwenku.com/question/p-vdjpsmjn-bes.html
https://www.itranslater.com/qa/details/2325790729974580224
来源:https://www.cnblogs.com/wujbclzw/archive/2021/04/29/14716862.html
标签:Django,表单,初始化
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
解决Django数据库makemigrations有变化但是migrate时未变动问题
2024-01-15 16:55:39
![](https://img.aspxhome.com/file/2023/2/125202_0s.jpg)
使用SQLSERVER 2005/2008 递归CTE查询树型结构的方法
2024-01-27 15:13:10
![](https://img.aspxhome.com/file/2023/5/110955_0s.png)
php 伪造本地文件包含漏洞的代码
2023-11-17 06:36:40
基于Python数据结构之递归与回溯搜索
2022-02-27 01:40:33
视觉直观感受若干常用排序算法
2022-05-09 06:45:24
![](https://img.aspxhome.com/file/2023/3/71383_0s.gif)
axios发送post请求springMVC接收不到参数的解决方法
2023-07-02 16:59:05
Oracle静态注册与动态注册详解
2024-01-19 22:31:31
Python3网络爬虫中的requests高级用法详解
2023-02-05 16:54:52
![](https://img.aspxhome.com/file/2023/3/124283_0s.jpg)
详解Python中的静态方法与类成员方法
2022-08-02 23:30:16
python numpy实现rolling滚动案例
2023-08-24 17:12:45
Javascript HTML5 Canvas实现的一个画板
2024-04-10 10:39:36
Golang中slice删除元素的性能对比
2024-05-05 09:33:03
MySQL单表查询实例详解
2024-01-15 20:39:43
基于python操作ES实例详解
2021-01-06 05:08:28
![](https://img.aspxhome.com/file/2023/0/98940_0s.jpg)
Python判断文件和文件夹是否存在的方法
2023-09-12 17:22:00
SQL Server数据库对上亿表的操作
2008-11-16 18:13:00
javascript知识点详解
2024-05-08 10:11:13
![](https://img.aspxhome.com/file/2023/1/129061_0s.png)
Python 日志logging模块用法简单示例
2021-10-08 19:47:20
![](https://img.aspxhome.com/file/2023/6/131616_0s.png)
谈谈XHTML中CDATA
2007-09-17 12:45:00
微信小程序时间轴实现方法示例
2024-04-18 10:02:17
![](https://img.aspxhome.com/file/2023/8/136138_0s.png)