zoukankan      html  css  js  c++  java
  • django-form.errors和前端上传文件

    • 一.上传文件:
      • 在相应的模型里面定义`FileField`或者是`ImageField`类型的字段,并且1.设置好`upload_to`参数来指定上传的路径.
      • class User(models.Model):
            """ 用户表 """
            username = models.CharField(max_length=12, verbose_name="用户名")
            _password = models.CharField(max_length=50, verbose_name="密码")
            headshot = models.ImageField(u'头像', upload_to='upload/%Y/%m/%d', null=True)
        headshot = models.ImageField(u'头像', upload_to="upload/%Y/%m/%d")  # 上传的路径,django自己创建路径
     
    • 如果是使用ImageField,会需要安装一个依赖Pillow, Pillow是专门做图片处理的一个python包
     
    pip install Pillow
     
     
    • 2.需要在`settings.py`文件中指定媒体路径`MEDIA_ROOT`.
     MEDIA_URL = '/media/'  
    MEDIA_ROOT = os.path.join(BASE_DIR, ''media')
     ps: 这里是媒体文件,它也是一种静态文件,在django中,这一块的内容是要跟其它静态文件分开处理的
     
    • django 中的文件存储分为两种
      • 静态文件存储,一般是我们的JS、css、系统的图片文件等
      • 媒体文件存储,一般是用户上传的图片、文件数据,或大的文件或视频等等
     
    • 3.文件上传需要在HTML代码中的form表单中添加`enctype="multipart/form-data"`以及在views当中,使用`request.FILES`来接收文件.
     
    form = LoginUserForm(request.POST, request.FILES)
     
    • 文件只有在保存时才会处理,数据库保存的是文件的路径,不会保存文件本身.
    • 3.1 前端通过input type='file' 传文件。后端通过request.FILES.get('name') 取得
    try:
        file_content = request.FILES.get('upfile')
        sysfile = os.path.abspath('.') + '/' + 'media'
        file_save_path = os.path.join(sysfile, file_content.name)
        with open(file_save_path, 'wb') as f:
            for chunk in file_content.chunks():
                f.write(chunk)
        # build_absolute_uri 自动返回服务器的地址
        url = request.build_absolute_uri(settings.MEDIA_URL+file_content.name)
        return restful.result(data={'url': url})
    except:
        return restful.params_error('识别不了该文件')
    • 4 设置url,访问保存的文件
    from django.urls import include, path
    from django.conf.urls.static import static
    from django.conf import settings # settings是配置文件settings.py

    urlpatterns = [ path("", include("apps.app.urls")), ] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) # 配置的媒体路径
    • 二.表单错误消息:
      • 表单验证没有通过后,表单会产生一个`errors`属性,这个属性包括所有的验证错误信息。
      • 通过`form.errors`即可访问。
      • 通过`form.erros.属性名`访问对应的错误
      • 通过`form.errors.as_json()`可以将错误消息转换成json数据。
      • 自定义错误消息:在`Field`中添加一个`error_messages`的`dict`类型的参数,然后根据`属性名`设置对应的`message`,例如以下代码:
      • 必须要执行完is_valid函数,否则errors是不会包含错误
    • 表单自定义错误消息:
      • 在表单中,重写方法`clean_field`(field是一个属性名),可以自定义针对某一个`field`的验证机制,如果出现错误
    • 如果某个`field`出现验证错误,通过`add_error`方法给指定的field添加错误消息。
    • 直接抛出一个`raise ValidationError(message, code="属性名")`就可以了。
    • 重写`clean`方法会在先完成`django`默认的验证后,再重新执行`clean`方法的验证
    • 如果验证完成成功了,则直接返回当前值
     
        def clean_password(self):
            password = self.cleaned_data.get('password',None)
            if len(password) < 6:
                raise forms.ValidationError(u'password at least 6 length',code='min_length')
            return password
  • 相关阅读:
    安全购买数码相机的诀窍!(1)
    获得网卡MAC地址和IP地址
    用Asp.net实现基于XML的留言簿之二
    安全购买数码相机的诀窍!(2)
    使用Flash读取COOKIE
    数码常识:CCD的原理
    ACE 5.5 Make in RedHat AS 4 Update 4 Issue
    Eclipse Plugins 开发 (1)
    RedHat AS4 Update4 DNS (bind 9) 配置
    Maven2 & Continuum 持续整合 (1)
  • 原文地址:https://www.cnblogs.com/tangpg/p/9040491.html
Copyright © 2011-2022 走看看