本文已参与「新人创作礼」活动,一起开启掘金创作之路。
django自带的admin框架有些功能扩展的并不是很好,所以今天我们介绍xadmin这种好的第三方框架
环境
- pyCharm
- python 3.6
- django 2.0
创建一个新的项目
配置好数据库时区
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'example', # 数据库名字
'USER': 'root', # 账号
'PASSWORD': '123456', # 密码
'HOST': '127.0.0.1', # IP
'PORT': '3306', # 端口
}
}
# 设置语言
LANGUAGE_CODE = 'zh-hans'
# 设置时区
TIME_ZONE = 'Asia/Shanghai'
默认情况下系统使用的是django自带的admin框架
新建 new->Python package
将从github上下载的xadmin源码包拷到刚创建的文件夹面,然后执行下面操作
上面的操作意思就是把xadmin这个框架配置到根资源目录下,让python文件可以调用找到它
setting.py 配置
import os
# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
import sys
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
# 将这个文件夹添加到根目录下面
sys.path.insert(0,os.path.join(BASE_DIR, 'extra_apps'))
....
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'users.apps.UsersConfig',
# 添加这两个应用,下一个没有的自己安装
'xadmin',
'crispy_forms',
]
### url更换
```python
from django.contrib import admin
from django.urls import path
import xadmin
urlpatterns = [
# path('admin/', admin.site.urls),
path('xadmin/', xadmin.site.urls),
]
后启动后台

> 到这里xadmin的配置基本完毕
```python
# 使用下面的命令迁移生成数据表格并创建管理员账户
#python manage.py makemigrations
#python manage.py migrate
#python manage.py createsuperuser
登陆xadmin的后台
xadmin的前期配置基本完毕,接下来就是开发了
建static存放静态文件
创建用户模型类继承 AbstractUser
# 用户模型类
class UserProfile(AbstractUser):
# 这个字段在后台是可以下拉的选项
gender_choices = (
('male', '男'),
('female', '女'),
)
nick_name = models.CharField('昵称', max_length=50, default='')
birthday = models.DateField('生日', null=True, blank=True)
gender = models.CharField('性别', max_length=12, choices=gender_choices, default='female')
adress = models.CharField('地址', max_length=100, default='')
mobile = models.CharField('手机号', max_length=11, null=True, blank=True)
# Django 模型中的verbose_name我们常常可能需要使用。
# 比如将数据库里面的数据导出成csv文件,那么csv文件的表头的名字可以通过取每个字段的verbose_name来获取,
# 数据可以通过queryset语句来获取。 这样制作出来的csv表就能想数据库一样,字段名和字段值一一对应了。
class Meta:
verbose_name = '用户信息'
verbose_name_plural = verbose_name
def __str__(self):
# AbstractUser这个类里面有 username这个属性
return self.username
'''
为什么要继承AbstractUser这个类来做user呢,这个类在django里面已经注册过了,
系统已经自带了很多属性,上面使我们主动添加的属性,等下看数据库就知道了
'''
在setting.py中重载这个user
# 重载
AUTH_USER_MODEL = "users.UserProfile"
执行迁移文件命令后查看数据库
我们可以看到数据库中创建的表是xadmin的,而且这个用户表很多字段不是我们创建,是因为我们呢继承了 AbstractUser
定义一个注册的页面
<!DOCTYPE html>
<html lang="en">
{% load staticfiles %}
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
注册<br>
<form action="{% url 'register' %}" method="post">
用户名 <input type="text" name="username" value=""><br>
密码 <input type="text" name="password" value=""><br>
<input type="submit" value="注册"><br>
{{ msg }}
{% csrf_token %}
</form>
</body>
</html>
msg 是注册弹出来的信息,输入是否合理,是否注册成功
url
path('register/', RegisterView.as_view(), name="register"),
view视图
class RegisterView(View):
def get(self,request):
return render(request,'register.html',{})
def post(self, request):
register_form = RegisterForm(request.POST)
if register_form.is_valid():
username = request.POST.get("username")
password = request.POST.get("password")
if UserProfile.objects.filter(username=username):
return render(request,'register.html', {'msg':"用户已经存在"})
else:
user = UserProfile()
user.username = username
user.password = make_password(password)
user.is_active= False
user.save()
return render(request, 'register.html', {"msg":"注册成功"})
else:
return render(request, 'register.html', {"msg": "输入不正确"})
注意这里的make_password 是调用
from django.contrib.auth.hashers import make_password包下的方法,不至于让密码很明显的看到,这样一来,在数据库里面也看不到密码信息,其次这里的RegisterForm是对输入的内容进行校验,是否满足相关要求,这里就这几道app下面的一个forms.py文件下的内容了,没有的话创建一个
class RegisterForm(forms.Form):
# 给注册的输入框设置格式
username = forms.CharField(required=True)
password = forms.CharField(required=True,min_length=5)
# 也就是说,username和password不能为空 required就是这个意思,其次 密码最小是5位,如果不满足此要求会有提示信息
从上面的截图我们可以看到,只有当输入是合理的时候才会注册成功,这里所谓的合理就是RegisterForm里面来决定的
查看数据库
我们可以看到. 这里已经把刚才的数据库存进去了,并且是不会显示密码的,但是密码就在数据库里面
更多内容请看下一篇播客...