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
原文地址:https://www.cnblogs.com/tangpg/p/9040491.html