BBS项目附加知识

setting中

创建一个静态文件

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

自定义auth_user文件

AUTH_USER_MODEL = 'app01.Userinfo'

连接MySQL数据库

'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'bbs',
        'USER':"root",
        'PASSWORD':'123',
        'HOST':'127.0.0.1',
        'PORT':3306,
        'CHARSET':'utf8'
    }

数据库中

使用auth_user表需继承AbstractUser并扩展属性

class Userinfo(AbstractUser):
phone = models.CharField(max_length=11,null=True)
    # 当用户上传自己的头像的时候 会将用户上传的头像文件自动存入avatar文件夹下
avatar = models.FileField(upload_to='avatar/',default='avatar/default.jpg')
create_time = models.DateField(auto_now_add=True)  # 创建数据的时候自动添加当前时间
blog = models.OneToOneField(to='Blog',null=True)

将用户上传的文件放到指定文件见

avatar = models.FileFileld(upload_to='avatar/',default='avatar/default.jpg')

创建数据的时候自动添加/刷新当前时间

create_time = models.DateField(auto_now_add=True)
auto_now=True 用来刷新时间,用于用户登录中

存放大文本内容

content = models.TextField()

存放布尔类型

is_up = models.BooleanField()

外键

user = models.ForeignKey(to='Userinfo')

自关联self

parent = models.ForeignKey(to='self',null=True)

Form

属性

1、label ='名字':输入框前的提示信息
2、error_messages={
'required':'用户名不能为空',
'invalid':'邮箱格式错误',
}
3、widget=forms.widgets.TextInput(attrs={"class":'form-control'}):输入框为什么性质的输入框,并为标签添加class属性

钩子

# 局部钩子  判断当前用户名是否存在
    def clean_username(self):
        username = self.cleaned_data.get('username')
        user_obj = models.Userinfo.objects.filter(username=username).first()
        if user_obj:
            self.add_error('username','用户名已存在')
        else:
            return username

    # 全局钩子  校验两次密码是否一直
    def clean(self):
        password = self.cleaned_data.get('password')
        confirm_password = self.cleaned_data.get('confirm_password')
        if not password == confirm_password:
            self.add_error('confirm_password','两次密码不一致')
        else:
            return self.cleaned_data

html

在标签循环过程中获取某个标签的id

点击输入框上的文本也能使输入框获取到焦点需要将label中的for指向输入框的id

<label for="{{ foo.auto_id }}">{{ foo.label }}</label>

将文件框内选择的文件替换显示到桌面

// 获取文件对象
var fileObj = $(this)[0].files[0];
// 利用内置对象 文件阅读器 FileReader
var fileReader = new FileReader();
// 将文件对象交给文件阅读器 生成文件对象的二进制数据
fileReader.readAsDataURL(fileObj);  // 异步
// DOM操作 修改img标签的src属性值
fileReader.onload = function (){
$('#id_img').attr('src',fileReader.result)
};

内置对象FormData完成既有普通键值又有文件数据的发送

var formData = new FormData();
formData.append('my_avatar',$('#id_file')[0].files[0]);

serializeArray/each循环

会将form标签内 普通的键值对 自动组成一个数组的形式返回给你

$.each($('#myform').serializeArray(),function (index,obj) {  // $.each(你想要被循环的对象,函数(索引,单个单个的对象))
 // console.log(index,obj)
 formData.append(obj.name,obj.value)  // 仅仅是将普通的键值对添加进去
        });

字符串拼接

循环错误信息

var targetId = '#id_' + index;
$(targetId).next().html(obj[0]).parent().addClass('has-error')

获取焦点事件focus

// input框获取焦点事件
    $('input').focus(function () {
        // 将当前input所在的div移除has-error属性 并将下面的span标签内的内容也移除了
        $(this).next().html('').parent().removeClass('has-error')
    })

django中测试脚本书写

import os
import sys

if __name__ == "__main__":
	os.environ.setdefault("DJANGO_SETTINGS_MODULE", "day66.settings")
	import django
	django.setup()
		  
	from app01 import models
	print(models.Userinfo.objects.all())
原文地址:https://www.cnblogs.com/huanghongzheng/p/11234839.html