Django之ModelForm学习

本篇主要的知识点:

  • 使用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("/")

 

posted @ 2022-05-29 19:29  人人从众  阅读(235)  评论(0编辑  收藏  举报