- 创建超级管理员:
./manage.py createsuperuser
- 修改超级管理员密码:
./manage.py changepassword username
Django用户模型类
常用字段
字段 | 作用 |
---|---|
username | 必选 ,150个字符以内,用户名可能包含字母数字,_,@,+ . 和-个字符。 |
first_name | 可选(blank=True),少于等于30个字符。 |
last_name | 可选(blank=True),少于等于30个字符。 |
可选(blank=True),邮箱地址。 | |
password | 必选 ,密码的哈希及元数据,(Django 不保存原始密码) |
groups | 与Group 之间的多对多关系。 |
user_permissions | 与Permission 之间的多对多关系。 |
is_staff | 布尔值:用户是否拥有网站的管理权限 |
is_active | 布尔值:指示用户的账号是否激活(允许登录),设置为False而不是删除帐户。 |
is_superuser | 布尔值:指定这个用户拥有所有的权限而不需要给他们分配明确的权限。 |
last_login | 用户最后一次登录的时间:str(datetime.datetime.today())。 |
date_joined | 账户创建的时间,默认设置为当前的date/time。 |
常用方法
字段 | 作用 |
---|---|
set_password | 设置用户的密码,不会保存User 对象。当为None时,密码将设置为一个不可用的密码。 |
check_password | 如果给定的raw_password是用户的真实密码,则返回True,可以在校验用户密码时使用。 |
create_user | 创建、保存并返回一个User对象。 |
create_superuser | 与create_user() 相同,但是设置is_staff 和is_superuser 为True。 |
Admin中的各项配置
官网:https://docs.djangoproject.com/en/1.11/ref/contrib/admin/#modeladmin-options
命令 | 作用 |
---|---|
list_display | 配置列表页面展示那些字段 |
list_display_links | 用来配置哪些字段可以作为链接, 点击他们可以进入编辑页面 |
list_filter | 配置页面过滤器, 需要通过哪些字段来过滤列表页, |
search_fields | 配置搜索字段 |
actions_on_top | 动作相关配置, 是否展示在顶部 |
actions_on_botton | 动作相关配置, 是否展示在底部 |
save_on_top | 保存, 编辑, 编辑并新建按钮是否在顶端展示 |
自定义函数
- 在list_display中展示自定义的字段, 可以自定义函数
- 参数一定:就是当前
行
的对象, 列表中的每一行对应数据库表中的一条数据, 也对应Model中的一个实例- 可以返回HTML, 但是需要
format_html()
函数处理 reverse
是根据名称解析出URL地址- oprator.short_description就是指定表头的展示文案
- 可以返回HTML, 但是需要
- 自定义函数是
针对list_display
的, 添加了自定义函数之后, 还需要在list_display中添加
定制Admin
- 我们需要操作的页面基本只有两种:
- 数据批量展示和操作的列表页
- 数据增加或者修改的编辑(新增)页
自定义函数-权限管理
SimpleListFilter
: 提供和两个属性
,两个方法
供我们重写:- 属性:
title
: 用于展示标题parameter_name
: 就是查询时URL参数的名字
- 方法:
lookups
: 返回要展示的内容和查询的idqueryset
: 根据URL 中, Query的内容, 返回列表页数据
- 属性:
让用户在侧边栏的过滤器中告知显示自己创建的分类
查询分类id为1时: URL后面的Query部分是?owner_category=1
, 此时就可以根据过滤器拿到这个id ==> quesyset里面拿到self.value()就是1
此时会根据1来过滤器QuerySet, 这里的QuerySet是列表页中展示数据的合集,即post数据集
编写完之后, 只要修改list_filter ==>list_filter = [CategoryOwnerFilter]
编辑页面的配置
- 按钮位置:
save_on_top
控制是否在页面顶部展示三个按钮 - 展示顺序:
filelds
,fileldset
, 字段是否展示以及展示的顺序 - 是否展示:
exclude
, 指定哪些字段不展示 fieldsets
: 用来控制布局, 要求的格式是有两个元素的tuple和list:- 两个tuple内容:
- 第一个元素是当前模板的名称(string)
- 第二个元素是当前模板的描述, 字段和样式配置(dict) => key可以是:
fields
,description
,classes
- 两个tuple内容:
exclude = ('owner',)
fieldsets = (
(
"基础配置", {
"description": "基础配置描述",
"fields": (
('title', 'category'),
'status',
),
}
), (
"内容", {
'fields': (
'desc', 'content'
),
}
), (
"额外信息", {
'classes': ('collapse',),
'fields': ('tags',),
}
)
)
使用Xadmin
- 下载安装xadmin:
pip install https://github.com/sshwsfc/xadmin/tarball/master
- 注册xadmin: ‘xadmin’,‘crispy_forms’,
- 把所有app中的admin.py改名
xadmin.py
- 修改ModelAdmin的继承对象,继承自
object
或者去掉继承,自定义的site无法使用(不支持多site) - admin.register ==>
@xadmin.sites.register
- URL:
url(r'^admin/', xadmin.site.urls, name="xadmin"),
- 标题:在setting.py中修改:
XADMIN_TITLE = "后台管理" # 左上方的文字
XADMIN_FOOTER_TITLE = "wwwxxx@qq.com" # 最下面的文字
页面控制
命令 | 作用 |
---|---|
list_display | 控制列表展示的字段 |
search_fields | 控制可以通过搜索框搜索的字段名称,xadmin使用的是模糊查询 |
list_filter | 可以进行过滤操作的列 |
ordering | 默认排序的字段 |
readonly_fields | 在编辑页面的只读字段 |
exclude | 在编辑页面隐藏的字段 |
list_editable | 在列表页可以快速直接编辑的字段 |
show_detail_fileds | 在列表页提供快速显示详情信息 |
refresh_times | 指定列表页的定时刷新 |
list_export | 控制列表页导出数据的可选格式 |
data_charts | 控制显示图标的样式 |
model_icon | 控制菜单的图标 |
Django2.0+集成xadmin
这里是之前我在使用Django2.0+的时候,踩过的坑,分享下:
ImportError: No module named 'django.core.urlresolvers'
- 修改D:\Envs\django-xadmin\lib\site-packages\xadmin-0.6.1-py3.6.egg\xadmin\models.py 文件
- 把from django.core.urlresolvers import NoReverseMatch, reverse修改为:from django.urls import NoReverseMatch,reverse
TypeError: __init__() missing 1 required positional argument: 'on_delete'
- 把content_type = models.ForeignKey(ContentType)修改为:
- content_type=models.ForeignKey(ContentType,on_delete=models.CASCADE)
TypeError: __init__() takes 1 positional argument but 6 were given
- 把forms.Field.init(self, required, widget, label, initial, help_text, *args, **kwargs) 修改成:
- forms.Field.init(self)
ImportError: cannot import name 'login'
- from django.contrib.auth.views import login, logout 修改为:
- from django.contrib.auth.views import LoginView, LogoutView
ImportError: cannot import name 'QUERY_TERMS'
- from django.db.models.sql.query import LOOKUP_SEP, QUERY_TERMS 修改为:
- from django.db.models.sql.query import LOOKUP_SEP, Query
ImportError: cannot import name 'password_reset_confirm'
- from django.contrib.auth.views import password_reset_confirm 修改为:
- from django.contrib.auth.views import PasswordResetForm
AttributeError: 'Settings' object has no attribute 'MIDDLEWARE_CLASSES'
- if settings.LANGUAGES and ‘django.middleware.locale.LocaleMiddleware’ in settings.MIDDLEWARE_CLASSES: 修改为:
- if settings.LANGUAGES and ‘django.middleware.locale.LocaleMiddleware’ in settings.MIDDLEWARE:
django rest framework 使用Django后台的用户表创建用户
在serializers.py
中配置序列化器
# 用户登录的序列化器
class AuthUserSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = "__all__"
在views.py
中配置用户类
- 继承自
viewsets
下的GenericViewSet
,配合mixins
下的一系列类使用 - 在这个AuthUserView中,只允许创建用户和查看用户
如果用此方法创建新用户,数据库存放密码将未加密,无法正常登陆
- 要经过检验:serializer.is_valid(raise_exception=True),
- 且检验过后,需要用检验过的data去加密serializer.validated_data为检验后的值,作字典使用
- 通过使用
make_password()
加密:from django.contrib.auth.hashers import make_password
# 重写 ==> admin创建的用户密码加密登录校验
class AuthUserView(viewsets.GenericViewSet, mixins.CreateModelMixin, mixins.ListModelMixin):
serializer_class = AuthUserSerializer
queryset = User.objects.all()
def create(self, request, *args, **kwargs):
serializers = self.get_serializer(data=request.data)
serializers.is_valid(raise_exception=True)
serializers.validated_data["password"] = make_password(serializers.validated_data["password"])
self.perform_create(serializers)
headers = self.get_success_headers(serializers.data)
return Response(serializers.data, status=status.HTTP_201_CREATED, headers=headers)
评论区