本文主要是介绍Django 2.1.7 form处理select下拉菜单,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
需求
在开发的过程,会有很多form表单需要select下拉菜单的枚举类设置,如果一个个在前端中写死是很不合理的。应该要在models数据模型设置的时候就直接配置好,然后前端直接读取枚举数据,然后在前端通过模板直接读取,或者json返回。
下面来写一个示例来看看。
参考文献
https://docs.djangoproject.com/zh-hans/2.1/topics/forms/formsets/
示例
1)创建数据模型类以及form表单设置
from django.db import models
from django import formsclass FormTestForm(forms.Form):"""FormTest数据模型的form表单字段"""# 任务类型的下拉数据task_type_choices = ((0, '常规任务'),(1, '线上业务日常轮询'),(2, '全链路任务'),)# 设置form表单的必填项task_type = forms.ChoiceField(label='任务类型:', widget=forms.Select(), choices=task_type_choices,initial=task_type_choices[0])comment = forms.CharField(label='备注',max_length=30)class FormTest(models.Model):"""FormTest数据模型类"""# 任务类型的下拉数据task_type = models.SmallIntegerField(default=0, choices=FormTestForm.task_type_choices, verbose_name='任务类型')comment = models.CharField(max_length=30, verbose_name='备注信息')class Meta:db_table = 'dp_form_test'verbose_name = 'form表单测试'verbose_name_plural = verbose_nameordering = ['id'] # 排序字段
2)执行数据迁移
python3 manage.py makemigrations
python3 manage.py migrate
查看生成的数据表:
mysql> desc dp_form_test;
+-----------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-----------+-------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| task_type | smallint(6) | NO | | NULL | |
| comment | varchar(30) | NO | | NULL | |
+-----------+-------------+------+-----+---------+----------------+
3 rows in set (0.00 sec)mysql>
3)编写一个视图来处理form表单
from .models import FormTest,FormTestForm# ex:/assetinfo/form_test
class FormTestView(View):def get(self,request):form_test_form = FormTestForm() # 创建form类context = {'form_test_form': form_test_form,}return render(request,'form_test/form_test.html',context=context)def post(self,request):form_test_form = FormTestForm(request.POST) # 创建form类,接收POST请求参数,用于数据校验if form_test_form.is_valid(): # 判断表单数据是否正确task_type = request.POST.get('task_type','')comment = request.POST.get('comment','')# 将数据写入数据库FormTest.objects.create(task_type=task_type,comment=comment,)return HttpResponse("task_type = %s, comment = %s" % (task_type, comment))else: # 表单验证未通过,直接返回错误task_type = request.POST.get('taskTypeSelect', '')errors = form_test_form.errors # 打印错误信息return HttpResponse("error, task_type = %s, errors = %s" % (task_type, errors))
4)配置url
urlpatterns = [# ex:/assetinfo/form_testpath('form_test', FormTestView.as_view(), name='form_test'),
]
5)编写一个form表单的html简单页面
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body><form method="post">{% csrf_token %}{# 设置的name必须与form表单中设置的一致,不然form无法获取,导致is_vaild判断没有必填项,导致错误 #}<select class="form-control" id="taskTypeSelect" name="task_type"><option selected="" name="taskTypeSelect">选择任务类型</option>{% for key,value in form_test_form.task_type_choices %}<option value="{{ key }}" name="task_type">{{ value }}</option>{% endfor %}</select><input type="text" name="comment" id="commemt"><button type="submit" >提交</button></form>
</body>
</html>
注意:设置的name必须与form表单中设置的一致,不然form无法获取,导致is_vaild判断没有必填项,导致错误
6)启动服务,测试正常请求
请求成功,则返回浏览器请求的值。
多次请求之后,查看mysql存储的值是否正确,如下:
mysql> select * from dp_form_test;
+----+-----------+---------+
| id | task_type | comment |
+----+-----------+---------+
| 1 | 0 | 备注 |
| 2 | 0 | 备注 |
| 3 | 1 | 备注3 |
+----+-----------+---------+
3 rows in set (0.00 sec)mysql>
请求成功,以及保存数据成功!!
7)测试错误请求
不填写任务数据,直接请求,则报错如下:
可以看到,通过form_test_form.errors
参数,可以获取打印相关的错误信息。当然,也可以自定义错误信息。
这篇关于Django 2.1.7 form处理select下拉菜单的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!