最近在学习Django框架,然后准备结合一些业务做一些web应用来处理工作中的问题。目前正好赶上了天津的疫情隔离,所以抓紧这些难得时间,学习一些东西来提升自己。
本篇主要的知识点:
- 使用ModelForm 来创建表单
- 为form表单添加自定义样式
- 针对表单中存在文件上传的情况
1.关于ModelForm
在折腾表单的时候,很多时候,我们的表单是需要和数据库打交道的,也就是要把表单内容,存储到数据库。Django提供了ModelForm来帮助我们快速的解决这个问题。主要的流程如下:
- 创建模型,定义需要的内容。
- 创建表单,继承ModelForm类,配置需要的列及样式等。
- 创建视图,编写相关的视图逻辑,并注册路由。
参考:
(省略部分代码,保留关键部分)
# 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()。然后我也一模一样的写了进去。但是呢,很遗憾,没有成功~
查了一些资料,然后找到一些原因:
- 表单没有加:enctype="multipart/form-data"
- view的生成form的时候要有request.FILES
- html用于上传文件的input名字和form定义的是否一致
- 。。。
不过,这些好像并没有解决我的问题。
额,好像又错过了什么。是的,需要request.FILES。
视图这里应该这样写:
if request.method == "POST":
form = LKForm1(request.POST,request.FILES)
if form.is_valid():
form.save()
return redirect("/")
嗯,过程中还遇到一个问题是,怎么看错误日志。。嗯,我做表单提交的时候,反复很多次,都没有提交成功,但是却不输出错误,我猜测是我提交表单有问题,但是我没有打印出来对应的异常。
烦恼~
继续努力吧。