django中博客后台将图片上传作为用户头像

添加上传目录

# 如果不添加上传目录,仍然可以上传成功,默认为project目录,如果models.py定义了upload_to="目录名称",则会上传到"project/目录名称"这个目录,如果添加了如下配置,会上传到"project/media"目录或者project/media/upload_to="目录名称"/:

settings.py

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

后台注册页面

# ajax在提交图片到后台的时候,不能直接将图片作为字典传递,而是formData。

例:

var formData = new FormData;

formData.append("username", $("#id_username").val());
formData.append("password", $("#id_password").val());
formData.append("re_password", $("#id_re_password").val());
formData.append("email", $("#id_email").val());
// 这里传递的是文件对象,是为了能够定位文件,后台获取到这个文件对象后会通过models字段单中的upload_to="avator"参数传递到服务器目录。
formData.append("avatar", $("#id_avatar")[0].files[0]);
formData.append("csrfmiddlewaretoken", $("[name='csrfmiddlewaretoken']").val());

"en">

    "UTF-8">
    注册


    "stylesheet" href="/static/css/bootstrap.min.css">
    "stylesheet" href="/static/css/backend.css">

    
class="container register">
class="row">
class="col-md-6 col-md-offset-3"> { # form添加novalidate参数,代表取消前端h5的验证,比如邮箱格式验证#}
"/register/" method="post" class="form-horizontal" enctype="multipart/form-data"> { % csrf_token %}
class="form-group">
class="col-sm-8"> { { form_obj.username }} class="help-block">{ { form_obj.username.errors.0 }}
class="form-group">
class="col-sm-8"> { { form_obj.password }} class="help-block">{ { form_obj.password.errors.0 }}
class="form-group">
class="col-sm-8"> { { form_obj.re_password }} class="help-block">{ { form_obj.re_password.errors.0 }}
class="form-group">
class="col-sm-8"> { { form_obj.email }} class="help-block">{ { form_obj.email.errors.0 }}
class="form-group">
class="col-sm-8"> "file" id="id_avatar" style="display: none;" name="avatar" accept="image/*">
class="form-group">
class="col-sm-offset-2 col-sm-8">
{ # #}
register.html

 

views.py

def register(request):
    if request.method == "POST":
        ret = {
     "status": 0, "msg": ""}
        form_obj = forms.RegForm(request.POST)
        # print(request.POST)
        if form_obj.is_valid():
            # 数据库中没有re_password字段,需要从字典中剔除re_password字段
            form_obj.cleaned_data.pop("re_password")
            # 接收从ajax发送过来的的图片数据
            avatar_img = request.FILES.get("avatar")
            print(avatar_img)
            models.UserInfo.objects.create_user(**form_obj.cleaned_data, avatar=avatar_img)
            ret["msg"] = "/reg/" # ajax在接收到ret对象后,会将这个数据取出,并且将这个数据通过使用location.href作为跳转目录
            return JsonResponse(ret)
        else:
            ret["status"] = 1
            ret["msg"] = form_obj.errors
            print(ret)
            return JsonResponse(ret)

    form_obj = forms.RegForm()
    return render(request, 'register.html', {
     "form_obj": form_obj})

def reg(request):
    return render(request, 'index.html') # 这里直接回复HttpResponse即可

 最后,也是最重要,添加url路由,切记切记

from django.views.static import serve
from django.conf import settings

urlpatterns = [
    re_path(r'^media/(?P.*)$', serve, {
     "document_root": settings.MEDIA_ROOT}),
]

 

转载于:https://www.cnblogs.com/ttyypjt/p/10593921.html

你可能感兴趣的:(python,前端,javascript)