- 创建超级管理员:
./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)
评论区