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())