django 表单的功能:
1 渲染html
2 表单验证数据是否合法
第二点用得比较多
常用的字段:
CharField:
功能: 用于接收文本
min_length:该字段的最小长度
max_length:该字段的最大长度
required:这个字段是否是必须的,默认是必须的
error_messages
EnailField:
功能:用来接收邮件,自动验证邮件是否合法
错误信息的key:required invalid
FloatField:
功能:用来接收浮点类型
max_value:最大的值
min_value:最小的值
错误信息的key:required invalid,max_value, min_value
IntegerField:
功能:接受一个整型
max_value:最大的值
min_value:最小的值
错误信息的key:required invalid,max_value, min_value
UrlField:
功能:用来接收url
错误信息的key:required invalid
常用验证器:
MaxValueValidator:最大值验证器 相当于参数max_value
MinValueValidator:最小值验证器 min_value
EmailValidator:邮箱验证器 相当于 EmailField
URLValidator:url验证器 相当于 UrlField
MaxLengthValidator:最大长度验证器 相当于参数max_length
MinLengthValidator:最小长度验证器 相当于参数min_length
自定义验证:
在forms.py中:
class RegisterForm(forms.Form):
username = forms.CharField(max_length=100, label=‘用户名’,
error_messages={‘required’: ‘这个字段必须写’, ‘max_length’: ‘该字段最大长度为100’})
telephone = forms.CharField(label=‘手机号码’,
validators=[validators.RegexValidator(r’1[345678]\d{9}’, message=‘请输入正确的手机号码’)],
error_messages={‘register_error’: ‘该手机号码已经被注册’})
password = forms.CharField(label=‘密码’, max_length=6, min_length=6,
error_messages={‘required’: ‘这个字段必须写’, ‘min_length’: “该字段最大长度为6”,
‘max_length’: ‘该字段最小长度为6’})
re_password = forms.CharField(label=‘密码’, max_length=6, min_length=6,
error_messages={‘required’: ‘这个字段必须写’, ‘min_length’: “该字段最大长度为6”,
‘max_length’: ‘该字段最小长度为6’})
def clean_telephone(self): # 自定义验证电话号码
telephone = self.cleaned_data.get('telephone')
is_exists = User.objects.filter(telephone=telephone).exists()
if is_exists:
raise forms.ValidationError(message='该手机号码已经被注册', code='register_error')
return telephone # 验证没有错误记得返回值
#验证多个字段,重写clean方法
def clean(self): # 针对多个字段
cleaned_data = super().clean()
password = cleaned_data.get('password')
re_password = cleaned_data.get('re_password')
if password != re_password:
raise forms.ValidationError(message='输入的密码不一致', code='error_re_password')
return cleaned_data
简化错误信息提取:
form 是forms.py中类的实例化对象
form.errors:错误信息,html格式的错误信息
form.errors.get_json_data():返回字典格式的错误信息,
form.errors.as_json()json格式的错误信息,方便传输
def get_errors(self):
errors = self.errors.get_json_data()
new_errors = {}
for key, message_list in errors.items():
message = []
for message_dict in message_list:
message.append(message_dict.get('message'))
new_errors[key] = message
return new_errors
{'password': ['该字段最大长度为6'], 'telephone': ['请输入正确的手机号码'], 're_password': ['该字段最大长度为6']}
ModelForm:
它可以直接继承models那里的字段,不用像forms.Form那样还必须自己写那些字段
class BookForm(forms.ModelForm):
def clean_page(self):
page = self.cleaned_data.get('page')
if page > 1000:
raise forms.ValidationError(message='page不能大于1000', code='page_error')
return page
class Meta:
model = Book
# 允许显示的字段
fields = '__all__'
# fields=['title', 'price']
# 不允许显示的信息
# exclude = ['page']
# 错误信息
error_messages = {
'title': {
'required': '请输入title',
'max_length': 'title的最大长度为100'
},
'page': {
'required': '请输入page',
'invalid': '请输入一个整数'
},
'price': {
'required': '请输入price',
'invalid': '请输入一个浮点数',
'max_value': '图书价格不能超过190'
}
}
文件上传:
1 在前端需要填写一个form标签,然后再form标签中指定enctype=“multipart/form-data”,不然就不能上传文件
2 在form里面添加一个标签,指定input的name以及type=‘file’
3 后端代码实现
class IndexView(View):
def get(self, request):
return render(request, ‘index.html’, locals())
def post(self, request):
myfile = request.FILES.get('myfile')
with open('a.txt', 'wb') as fp:
for chunk in myfile.chunks():
fp.write(chunk)
return HttpResponse('文件上传成功')
使用FileField字段:upload_to
在根目录新建一个file文件夹
class ArticleView(View):
def get(self, request):
return render(request, 'index1.html', locals())
def post(self, request):
title = request.POST.get('title')
content = request.POST.get('content')
file = request.FILES.get('myfile')
Article.objects.create(title=title, content=content, file=file) 这个保存的时候文件将会出现在files文件夹下,数据库存有该文件的路径
print(Article.objects.all().values('file'))
return HttpResponse('添加文章成功')
static:一般存储的是静态文件,html,css,js,image
media:一般存储的是上传的文件,指定MEDIA_ROOT 和MEDIA_URL
指定了这些之后FileField会自动把文件上传到media文件夹
上传文件路径配置
MEDIA_URL = ‘/media/’
MEDIA_ROOT = os.path.join(BASE_DIR, ‘media’)
那么如何设置·才能访问media的那些文件呢:
from django.conf.urls.static import static
from django.conf import settings
urlpatterns = [
path('admin/', admin.site.urls),
path('index/', IndexView.as_view(), name='index'),
path('upload_file/', ArticleView.as_view(), name='upload_file'),
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) # 加这个就是为了可以让media文件夹里面的文件可以被访问到
限制上传的文件类型:
思路就是结合验证器和forms
class Article(models.Model):
title = models.CharField(max_length=100, verbose_name='标题')
content = models.TextField(verbose_name='内容')
# file = models.FileField(upload_to='files')
# file = models.FileField() # 会自动上传到media中
# 验证器需要结合forms来使用,不然的话无效
file = models.FileField(upload_to='%Y/%m/%d',
validators=[validators.FileExtensionValidator(['txt'], message='上传文件类型必须为txt')])
class Meta:
verbose_name = '文章'
verbose_name_plural = verbose_name
def __str__(self):
return '文章对象:' + self.title
forms.py
注意,就是前端的标签的name值应该与字段名一致,否则将会找不到
from django import forms
from file_upload.models import Article
class ArticleForm(forms.ModelForm):
class Meta:
model = Article
fields = '__all__'
图片上传:
ImageField: upload_to参数
会自动上传到media那里
ImageField:需要安装pillow pip install pillow
图片上传和文件上传类似