专栏首页Devops专栏Django 2.1.7 form处理select下拉菜单

Django 2.1.7 form处理select下拉菜单

需求

在开发的过程,会有很多form表单需要select下拉菜单的枚举类设置,如果一个个在前端中写死是很不合理的。应该要在models数据模型设置的时候就直接配置好,然后前端直接读取枚举数据,然后在前端通过模板直接读取,或者json返回。 下面来写一个示例来看看。

示例

1)创建数据模型类以及form表单设置

from django.db import models
from django import forms

class 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_name
        ordering = ['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_test
    path('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)测试错误请求

不填写任务数据,直接请求,则报错如下:

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Python采用并发查询mysql以及调用API灌数据 (七)- 字典合并处理以及并发实现分析

    上一篇文章已经编写了解决datetime类型需要序列化的问题,那么本章节我们来继续编写循环请求API灌入数据,以及并发实现的初步分析。

    Devops海洋的渔夫
  • pycharm 已创建好的项目配置虚拟环境

    大部分django项目的虚拟环境都是在创建的时候一起创建好了。那么有一种情况就是,在远程git仓库创建好项目之后,用pycharm打开,这样就没有创建项目时候设...

    Devops海洋的渔夫
  • JavaScript 数组及操作方法

    可以看出join()方法并不会改变aList数组本身的值,只会生成一个字符串而已。

    Devops海洋的渔夫
  • 从MySQL的ibtmp1文件太大说起

    测试环境机器磁盘空间不足的告警打破了下午的沉寂,一群人开始忙活着删数据。但是,不久前刚清理了一波数据,测试环境在没做压测的情况下不至于短短一个月不到就涨了200...

    July
  • 看看你是哪种级别的Python程序员(已跪)

    同一个问题 不同层次的Python程序员 编出的Python代码 编程新手 def factorial(x): if x == 0: ret...

    量化投资与机器学习微信公众号
  • 加州大学提出:实时实例分割算法YOLACT,可达33 FPS/30mAP!现已开源!

    本文要介绍一篇很棒的实时实例分割论文:YOLACT,该论文是由 加利福尼亚大学 提出。截止2019年4月16日,据Amusi所了解,上述MS R-CNN应该是实...

    Amusi
  • 10X Genomics单细胞免疫组库VDJ分析必知必会

    我们生活着的世界并非只有我们自己,而是有很多小于或大于我们的生物不断与我们交互着,有的让我们开心,有的使我们伤心。这就关系到一个本质的问题:

    生信技能树jimmy
  • 程序员的进化

    程序员的进化   不久前,在互联网上出现了一篇有趣的文章,讲的是对于同一个问题,不同层次的程序员编出的Python代码显示出了不同的风格,代码都很简单,有趣。我...

    用户1289394
  • 寺库迟到的财报:盈利成为过去式

    在2020年第一季度里,作为奢侈品电商老大哥的寺库并不好过,原本难熬的日子在疫情里更是雪上加霜。财报数据显示,在2020年第一季度里,寺库实现营收为10.05亿...

    刘旷
  • mybatis sql语句转化

    Dar_Alpha

扫码关注云+社区

领取腾讯云代金券