Django表单之ModelForm实践

最近在学习Django框架,然后准备结合一些业务做一些web应用来处理工作中的问题。目前正好赶上了天津的疫情隔离,所以抓紧这些难得时间,学习一些东西来提升自己。

本篇主要的知识点:

  • 使用ModelForm 来创建表单
  • 为form表单添加自定义样式
  • 针对表单中存在文件上传的情况

1.关于ModelForm

在折腾表单的时候,很多时候,我们的表单是需要和数据库打交道的,也就是要把表单内容,存储到数据库。Django提供了ModelForm来帮助我们快速的解决这个问题。主要的流程如下:

  1. 创建模型,定义需要的内容。
  2. 创建表单,继承ModelForm类,配置需要的列及样式等。
  3. 创建视图,编写相关的视图逻辑,并注册路由。

参考:

(省略部分代码,保留关键部分)

# models.py
class testModel(models.Model):
    start_dt=models.DateField(verbose_name="开始时间")
    end_dt=models.DateField(verbose_name="结束时间")
    ranges=models.IntegerField(verbose_name="范围")
    checkFile=models.FileField(verbose_name="目标文件",upload_to="data/")

    class Meta:
        verbose_name="Test"
        verbose_name_plural="Test"

# forms.py

from django.forms import ModelForm
from ucheck.models import testModel
from django.forms import DateInput,TextInput,FileInput

class UDateInput(DateInput):
    input_type = 'date'
    # DateInput这个东西在视图离不起作用,还是text
    # 需要自己处理下

class TestForm(ModelForm):
    class Meta:
        model=LKModel
        fields=["start_dt","end_dt","ranges","checkFile"]
        widgets={
            "start_dt":UDateInput(),
            "end_dt":UDateInput(),
            "ranges":TextInput(attrs={"class":"form-control"}),
            "checkFile":FileInput(attrs={"class":"form-control"}),
        }

# views.py

def TestView(request):
    form=TestForm()
    if request.method == "POST":
        form = testModel(request.POST,request.FILES)
        if form.is_valid():
            form.save()
            return redirect("/")
    return render(request, "demo.html",{"form":form})

模板:

{% extends "layout.html" %}
{% block main %}

    <form action="/" method="post" enctype="multipart/form-data" class="form-horizontal" style="width: 400px;">
     {% csrf_token %}
     {% for field in form %}
         <div class="form-group">
            <label class="form-label" id="{{ field.id_for_label }}">{{ field.label_tag }}</label>
            {{ field }}
            {{ field.errors }}
         </div>
     {% endfor %}
    <br>
        <div class="form-group">
            <input type="submit" class="form-control" value="创建">
        </div>
     </form>
{% endblock %}

2.关于自定义样式

可以参考上面的代码离,有一个简单的例子。

需要注意的是针对日期选择器的场景,额,选择DateInput这个东西,在前端还是会转换为text的模式,所以需要自己实现一下。

3. 关于存在文件上传的场景

看文档的时候,使用modelform的时候,大家把数据存储到表单的时候,都仅仅是一个form.save()。然后我也一模一样的写了进去。但是呢,很遗憾,没有成功~

查了一些资料,然后找到一些原因:

  1. 表单没有加:enctype="multipart/form-data"
  2. view的生成form的时候要有request.FILES
  3. html用于上传文件的input名字和form定义的是否一致
  4. 。。。

 不过,这些好像并没有解决我的问题。

额,好像又错过了什么。是的,需要request.FILES。

视图这里应该这样写:

    if request.method == "POST":
        form = LKForm1(request.POST,request.FILES)
        if form.is_valid():
            form.save()
            return redirect("/")

嗯,过程中还遇到一个问题是,怎么看错误日志。。嗯,我做表单提交的时候,反复很多次,都没有提交成功,但是却不输出错误,我猜测是我提交表单有问题,但是我没有打印出来对应的异常。

烦恼~

继续努力吧。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

白日与明月

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值