django 表单

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

models.py

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
图片上传和文件上传类似

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值