1.6 博客系统 |FileField字段 |Media配置

基于forms组件和Ajax实现注册功能

1 基于forms组件设计注册页面

  --点击头像 === 点击input

  --头像预览:

    修改用户选中的文件对象;获取文件对象的路径;修改img的src属性,src=文件对象路径。

2.错误信息:

  views:

    forms.errors # {"user":[......] }

 Ajax.success:
     $.each(data.msg, function(field, error_list){
                        $("#id_"+field).next().html(error_list[0]);  //每次循环都把各自的信息放到input那下面了
                        $("#id_"+field).parent().addClass("has-error");
                    })

3.局部钩子和全局钩子校验

  user字段不能重复

  两次密码不能一致

4.FileField(可以上传任何文件)与ImageFiled(只能上传图片)

class UserInfo(AbstractUser):  #用户认证组件,要用用户表;扩展字段,继承AbstractUser类,
    '''用户信息'''
    nid = models.AutoField(primary_key=True)
    telephone = models.CharField(max_length=11, null=True, unique=True)   #这些字段接收一个字符串就可以了
    avatar = models.FileField(upload_to='avatars/', default="/avatars/default.png") #而它一定要接收一个文件对象

avatar_obj = request.FILES.get("avatar")
user_obj = UserInfo.objects.create_user(username = user, password = pwd, email = email, avatar = avatar_obj)
Django会实现:
  会将文件对象下载到项目的根目录中avatars文件夹中(如果没有avatar文件夹,Django会自动创建),user_obj的avatar存的是文件的相对路径。

 views.py

def register(request):
    if request.is_ajax():  #你点击那个按钮即使Ajax请求又是post请求。既可以用Ajax也可用method=post作分支判断
        print(request.POST) #把所有提交的数据都取出来
        form = UserForm(request.POST)  #用UserForm做检验,
        response = {"user":None, "msg":None} #发Ajax一般都会返回一个字典来进行标示这些行为
        if form.is_valid():  #数据全通过,成功
            response["user"] = form.cleaned_data.get("user") #注册人的名字

            #生成一条用户纪录
            user = form.cleaned_data.get("user")
            pwd = form.cleaned_data.get("pwd")
            email = form.cleaned_data.get("email")
            avatar_obj = request.FILES.get("avatar")
            user_obj = UserInfo.objects.create_user(username = user, password = pwd, email = email, avatar = avatar_obj)

        else:
            print(form.cleaned_data)  #干净数据
            print(form.errors)        #错误数据
            response["msg"] = form.errors  #失败了之后把这所有的错误信息放到msg里边
        return JsonResponse(response)
    form = UserForm()
    return render(request,"register.html", {"form":form})

5. Media配置之MEDIA_ROOT

Django有两种静态文件:

  /static/   :js,css,img

  /media/   :用户上传文件;  用户默认头像图片应该在media/avatar里边存一份。

class UserInfo(AbstractUser): 
'''用户信息'''
nid = models.AutoField(primary_key=True)
telephone = models.CharField(max_length=11, null=True, unique=True)
avatar = models.FileField(upload_to='avatars/', default="/avatars/default.png")
avatar_obj = request.FILES.get("avatar")
user_obj = UserInfo.objects.create_user(username = user, password = pwd, email = email, avatar = avatar_obj)

一旦配置了 

MEDIA_ROOT = os.path.join(BASE_DIR, "media") 这个路径(在settings里边)

Django会实现:
  会将文件对象下载到MEDIA_ROOT中avatars文件夹中(如果没有avatar文件夹,Django会自动创建),user_obj的avatar存的是文件的相对路径。

settings.py

STATIC_URL = '/static/'

STATICFILES_DIRS = [
    os.path.join(BASE_DIR,"static")
]

MEDIA_ROOT = os.path.join(BASE_DIR, "media")

views.py

def register(request):
    if request.is_ajax():  #你点击那个按钮即使Ajax请求又是post请求。既可以用Ajax也可用method=post作分支判断
        print(request.POST) #把所有提交的数据都取出来
        form = UserForm(request.POST)  #用UserForm做检验,
        response = {"user":None, "msg":None} #发Ajax一般都会返回一个字典来进行标示这些行为
        if form.is_valid():  #数据全通过,成功
            response["user"] = form.cleaned_data.get("user") #注册人的名字

            #生成一条用户纪录
            user = form.cleaned_data.get("user")
            pwd = form.cleaned_data.get("pwd")
            email = form.cleaned_data.get("email")
            avatar_obj = request.FILES.get("avatar")
            if avatar_obj: #如果上传了头像,else是没有上传就是默认头像了。
                user_obj = UserInfo.objects.create_user(username = user, password = pwd, email = email, avatar = avatar_obj)
            else:
                user_obj = UserInfo.objects.create_user(username = user, password = pwd, email = email)
        else:
            print(form.cleaned_data)  #干净数据
            print(form.errors)        #错误数据
            response["msg"] = form.errors  #失败了之后把这所有的错误信息放到msg里边
        return JsonResponse(response)
    form = UserForm()
    return render(request,"register.html", {"form":form})

6. Media配置之MEDIA_URL

  浏览器如何能直接访问到media中的数据

settings.py

MEDIA_URL = '/media/'

urls.py

#media配置
re_path(r"media/(?P<path>.*)$", serve, {"document_root":settings.MEDIA_ROOT})

浏览器访问http://127.0.0.1:8000/media/avatars/11.jpg可以直接访问static里边的文件

注意规范问题:

猜你喜欢

转载自www.cnblogs.com/shengyang17/p/9398174.html
1.6