将验证的错误信息保存到页面,将图片保存到数据库中

git

将验证的错误信息显示到页面

用ajax实现
首先建立一个FormData对象,将data信息append进去.
这里要注意两点:
1.ajax发送时,csrf防护信息也要发送formData.append("csrfmiddlewaretoken", $("[name='csrfmiddlewaretoken']").val());
2.如果发送的data中有文件,就需要在ajax的参数中加上processData: false, contentType: false,
数据传到后台之后,处理验证,之后返回data,success接受到data
通过判断data.status判断是否出错:
1.出错,通过$.each函数将错误显示
2.没出错,显示index页面

html文件
 $("#reg-submit").click(function () {
        // 取到用户填写的注册数据,向后端发送AJAX请求
        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());
        formData.append("avatar", $("#id_avatar")[0].files[0]);
        formData.append("csrfmiddlewaretoken", $("[name='csrfmiddlewaretoken']").val());

        $.ajax({
            url: "/reg/",
            type: "post",
            processData: false,
            contentType: false,
            data: formData,
            success:function (data) {
                if (data.status){
                    // 有错误就展示错误
                    // console.log(data.msg);
                    // 将报错信息填写到页面上
                    $.each(data.msg, function (k,v) {
                        // console.log("id_"+k, v[0]);
                        // console.log($("#id_"+k));
                        $("#id_"+k).next("span").text(v[0]).parent().parent().addClass("has-error");
                    })

                }else {
                    // 没有错误就跳转到指定页面
                    location.href = data.msg;
                }
            }
        })
    });
视图函数

需要注意的点:
需要改变status的值,需要给msg赋值,这些都通过ret返回,前端用data接受

# 注册的视图函数
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():
            # 校验通过,去数据库创建一个新的用户
            form_obj.cleaned_data.pop("re_password")
            avatar_img = request.FILES.get("avatar")
            models.UserInfo.objects.create_user(**form_obj.cleaned_data, avatar=avatar_img)
            ret["msg"] = "/index/"
            return JsonResponse(ret)
        else:
            print(form_obj.errors)
            ret["status"] = 1
            ret["msg"] = form_obj.errors
            print(ret)
            print("=" * 120)
            return JsonResponse(ret)
    # 生成一个form对象
    form_obj = forms.RegForm()
    print(form_obj.fields)
    return render(request, "register.html", {"form_obj": form_obj})

将图片保存在数据库中

首先看看models.py里是怎么设计这个属性的

class UserInfo(AbstractUser):
    """
    用户信息表
    """
    nid = models.AutoField(primary_key=True)
    phone = models.CharField(max_length=11, null=True, unique=True)
    avatar = models.FileField(upload_to="avatars/", default="avatars/default.png", verbose_name="头像")
    create_time = models.DateTimeField(auto_now_add=True)

    blog = models.OneToOneField(to="Blog", to_field="nid", null=True)

    def __str__(self):
        return self.username

avatar就是头像,他的上传路径是upload_to="avatars/",,他的默认头像是default="avatars/default.png"
这个时候可能会疑惑,为为什么这个用户信息类没有username,password等字段呢,这是因为这里这些关键字我们用Django自带的验证模块去写了.新建了一个forms.py文件

"""
bbs用到的form类
"""

from django import forms
from django.core.exceptions import ValidationError

# 定义一个注册的form类
class RegForm(forms.Form):
    username = forms.CharField(
        max_length=16,
        label="用户名",
        error_messages={
            "max_length": "用户名最长16位",
            "required": "用户名不能为空",
        },
        widget=forms.widgets.TextInput(
            attrs={"class": "form-control"},
        )
    )

    password = forms.CharField(
        min_length=6,
        label="密码",
        widget=forms.widgets.PasswordInput(
            attrs={"class": "form-control"},
            render_value=True,
        ),
        error_messages={
            "min_length": "密码至少要6位!",
            "required": "密码不能为空",
        }
    )

    re_password = forms.CharField(
        min_length=6,
        label="确认密码",
        widget=forms.widgets.PasswordInput(
            attrs={"class": "form-control"},
            render_value=True,
        ),
        error_messages={
            "min_length": "确认密码至少要6位!",
            "required": "确认密码不能为空",
        }
    )

    email = forms.EmailField(
        label="邮箱",
        widget=forms.widgets.EmailInput(
            attrs={"class": "form-control"},

        ),
        error_messages={
            "invalid": "邮箱格式不正确!",
            "required": "邮箱不能为空",
        }
    )


    # 重写全局的钩子函数,对确认密码做校验
    def clean(self):
        password = self.cleaned_data.get("password")
        re_password = self.cleaned_data.get("re_password")

        if re_password and re_password != password:
            self.add_error("re_password", ValidationError("两次密码不一致"))

        else:
            return self.cleaned_data

回到视图函数
关键代码:

 avatar_img = request.FILES.get("avatar")

得到图片

 models.UserInfo.objects.create_user(**form_obj.cleaned_data, avatar=avatar_img,phone="123123")

往数据库中插入,这里可以看到,因为form_obj.cleaned_data是froms.py中建立的清洗过的数据,所以这里面不包含其他的UserInfo信息,就要再写一个参数,比如电话(phone)

# 注册的视图函数
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():
            # 校验通过,去数据库创建一个新的用户
            form_obj.cleaned_data.pop("re_password")
            avatar_img = request.FILES.get("avatar")
            models.UserInfo.objects.create_user(**form_obj.cleaned_data, avatar=avatar_img,phone="123123")
            ret["msg"] = "/index/"
            return JsonResponse(ret)
        else:
            print(form_obj.errors)
            ret["status"] = 1
            ret["msg"] = form_obj.errors
            print(ret)
            print("=" * 120)
            return JsonResponse(ret)
    # 生成一个form对象
    form_obj = forms.RegForm()
    print(form_obj.fields)
    return render(request, "register.html", {"form_obj": form_obj})

我们的models.py中的UserInfo表和forms.py中的form注册类共同组成了UserInfo这个表,因为UserInfo继承自,如下:

from django.contrib.auth.models import AbstractUser


class UserInfo(AbstractUser):

我们看最后生成的表,既有password这些来自forms.py的属性也有phone这些来自UserInfo的属性,还有一些Django验证自带的属性比如is_staff
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你可以按照以下步骤使用 `fileupload` 控件将图片上传到数据库: 1. 在 HTML 页面,添加一个 `form` 元素,并设置 `enctype` 属性为 `"multipart/form-data"`,以支持文件上传: ```html <form action="upload.php" method="post" enctype="multipart/form-data"> <input type="file" name="image" /> <input type="submit" value="Upload" /> </form> ``` 2. 创建一个 PHP 文件(例如 `upload.php`),用于处理上传的图片,并将其保存数据库。首先,连接到数据库: ```php $servername = "localhost"; $username = "username"; $password = "password"; $dbname = "database"; $conn = new mysqli($servername, $username, $password, $dbname); if ($conn->connect_error) { die("Connection failed: " . $conn->connect_error); } ``` 3. 处理文件上传。首先,检查文件是否成功上传并且没有错误: ```php if (isset($_FILES["image"]) && $_FILES["image"]["error"] == 0) { // 文件上传成功 // 获取文件信息 $file = $_FILES["image"]; $fileName = $file["name"]; $fileTmpName = $file["tmp_name"]; $fileSize = $file["size"]; $fileType = $file["type"]; ``` 4. 将文件内容读取为二进制数据,并进行必要的验证。例如,检查文件类型是否为图片: ```php // 检查文件类型 $allowedTypes = array("image/jpeg", "image/png", "image/gif"); if (in_array($fileType, $allowedTypes)) { // 读取文件内容 $fp = fopen($fileTmpName, 'r'); $content = fread($fp, filesize($fileTmpName)); $content = addslashes($content); fclose($fp); ``` 5. 将文件内容插入到数据库: ```php // 将文件内容插入数据库 $sql = "INSERT INTO images (name, type, size, content) VALUES ('$fileName', '$fileType', $fileSize, '$content')"; if ($conn->query($sql) === TRUE) { echo "File uploaded successfully."; } else { echo "Error: " . $sql . "<br>" . $conn->error; } ``` 6. 关闭数据库连接: ```php $conn->close(); } ``` 请注意,上述代码仅为示例,并且没有包含对上传文件的完整验证和安全性处理。在实际应用,你可能需要添加更多的验证和安全性措施来保护你的应用程序和数据库
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值