如要要继承自auth的用户表,等要继承实体类写好了再开始第一次同步,暂时不清楚为什么,但之前都同步失败了
0.关于django中的静态文件的配置
# 配置前端页面中访问静态资源的起始路径
STATIC_URL = '/static/'
# 开发阶段:指定静态资源所在目录,STATIC_ROOT用来配置部署后静态资源路径
STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static'),]
1. 注释:
单行注释:{# 注释内容 #}
多行注释:
{% comment %}
多行注释内容
{% endcomment %}
2.创建项目和应用
#建立django项目
django-admin startproject XXXX
#创建app
python3 manage.py startapp XXXXapp
#数据库迁移
python3 manage.py makemigrations
python3 manage.py migrate
#注册后台显示
admin.site.register(UserInfo)
#创建后台用户
python3 manage.py createsuperuser
#创建项目环境
virtualenv XXXXenv
#引入环境
source XXXXenv/bin/activate
3.继承自user类
自带的user表默认的字段
from django.db import models
from django.contrib.auth.models import AbstractUser
# Create your models here.
SEX_CHOICES = (
('0', '男'),
('1', '女'),
)
class UserInfo(AbstractUser):
cellphone = models.CharField(max_length=11, null=False, verbose_name='手机')
realname = models.CharField(max_length=50, null=False, verbose_name='姓名')
uidentity = models.CharField(max_length=18, null=False, verbose_name='身份证')
address = models.CharField(max_length=150, null=False, verbose_name='地址')
sex = models.CharField('性别',choices=SEX_CHOICES, default='0', max_length=10)
def __str__(self):
return self.username
class Meta:
db_table = 'Users'
verbose_name = '用户信息表'
verbose_name_plural = verbose_name
4.项目搭建流程
创建项目 —> 创建应用 —> 更改配置文件(注册app,修改数据库配置) —> 创建实体类,同步
—> 开发app
DATABASES = {
#配置数据库,键全部大写
'default': {
'ENGINE': 'django.db.backends.mysql',
'USER': 'root',
'PASSWORD': '123456',
'HOST': 'localhost',
'PORT': 3306,
'NAME': 'mytest',
}
}
#继承django自带user类:app名.类名
AUTH_USER_MODEL = 'test1.StaffInfo'
LANGUAGE_CODE = 'zh-Hans'
TIME_ZONE = 'Asia/Shanghai'
#设置session在cookie中的保存时长
SESSION_COOKIE_AGE = 60*30
#设置浏览器关闭后session失效
SESSION_EXPIRE_AT_BROWSER_CLOSE = True
#admin.py中设置后台显示
from django.contrib import admin
from test1.models import *
# Register your models here.
admin.site.register(StaffInfo)
5.设置局域网访问:
#指定运行地址:
python3 manage.py runserver 192.168.121.128:8000
#修改配置文件
ALLOWED_HOSTS = ['*']
6.文件上传:
创建模型
# 设置上传路径和文件名
def file_name(instance,filename):
ext = filename.split('.')[-1]
filename = datetime.datetime.now().strftime('%Y%m%d%H%M%S%f') + '.' + ext
return 'front/static/upload/file/'+filename
class File(models.Model):
user = models.ForeignKey(User, verbose_name='用户', on_delete=models.CASCADE)
#upload_to 参数写上面定义的函数名,函数执行后返回路径
file = models.ImageField(upload_to=file_name, verbose_name='图片')
upload_time = models.DateTimeField(verbose_name='上传时间')
服务端接受
# 登陆状态下返回文件上传页面
@login_required
def upload(request):
return render(request, 'upload.html')
# 接受文件并保存
@login_required
def upload_(request):
if request.method == 'POST':
file = File()
file.user = request.user
# 此处接收文件对象,存入数据库中的是路径,服务端保存文件的路径依据upload_to确定
file.file = request.FILES.get('image')
# 存入时间
file.upload_time = datetime.now()
file.save()
return HttpResponse('上传成功')
7.利用django自带登陆验证功能
from django.contrib import auth
def login_(request):
if request.method == 'GET':
return render(request,'login.html',{'message':'登录撒'})
if request.method == 'POST':
username = request.POST.get('username')
password = request.POST.get('password')
#django自带登录验证功能,账号密码正确则返回用户对象,否则返回None
user = auth.authenticate(username=username,password=password)
if user is not None and user.is_active:
#将登录信息存入session,渲染模板时直接调用此对象{{ request.user.username }}
auth.login(request,user)
return redirect('/')
else:
return HttpResponse('登录失败')
#登出:auth.logout(request)
如果用户当前没有登录,user 将设置为 django.contrib.auth.models.AnonymousUser 的一个实例。
服务端可以通过 is_authenticated区分它们
def register(request):
# 注册前判断是否已登录
if request.user.is_authenticated:
return redirect('/')
return render(request,'register.html')
前端可以通过 {% if request.user.is_authenticated %}判断用户是否登录
{% if request.user.is_authenticated %}
{{ '已经登陆啦' }}
<br>
用户名{{ request.user.username }}
<br>
姓名{{ request.user.name }}
<br>
id{{ request.user.id }}
{% else %}
{{ '还没登录哦' }}
{% endif %}
8.静态资源的两种引用方式
{% load static %}
<img src="{% static 'img/7.jpg' %} " alt="" width="200px">
<img src="/static/img/7.jpg" alt="" width="200px">
9.django会将session存入django_session表中,点击登出后会删除表中的记录,若用户直接关闭浏览器,可通过设置SESSION_EXPIRE_AT_BROWSER_CLOSE = True,以此来保证关闭浏览器时退出登录,但该情况下,django并不会删除所生成的记录,日积月累,django_session表中的数据越来越多,需要定期的执行python manage.py clearsessions来清除过期的session。
10.访问限制 @login_required
某些页面需要用户登陆后才可以访问,如果用户没有登陆而直接访问就会跳转到登陆界面。
实现方法:
1、在相应的 view 方法的前面添加 django 自带的装饰器 @login_required
from django.contrib.auth.decorators import login_required
@login_required
def query_(request):
if request.is_ajax():
order_no = request.GET.get('order_no')
start_date = request.GET.get('start_date')
end_date = request.GET.get('end_date')
records = Recode.objects.all()
2、在 settings.py 中配置 LOGIN_URL 参数
LOGIN_URL = '/login/'
11.数据库迁移报错
django.core.exceptions.ImproperlyConfigured: mysqlclient 1.3.3 or newer is required; you have 0.7.11.None
参考:https://www.cnblogs.com/imyalost/p/8542181.html
MySQLclient目前只支持到python3.4,因此如果使用的更高版本的python,可以修改文件:/home/tarena/.local/lib/python3.5/site-packages/django/db/backends/mysql/base.py