"/>
侧边栏壁纸
博主头像
PySuper 博主等级

千里之行,始于足下

  • 累计撰写 218 篇文章
  • 累计创建 15 个标签
  • 累计收到 2 条评论

目 录CONTENT

文章目录
Web

Django站点管理

PySuper
2019-10-23 / 0 评论 / 0 点赞 / 32 阅读 / 0 字
温馨提示:
本文最后更新于2024-05-28,若内容或图片失效,请留言反馈。 所有牛逼的人都有一段苦逼的岁月。 但是你只要像SB一样去坚持,终将牛逼!!! ✊✊✊
  • 创建超级管理员: ./manage.py createsuperuser
  • 修改超级管理员密码:./manage.py changepassword username

Django用户模型类

常用字段

字段 作用
username 必选,150个字符以内,用户名可能包含字母数字,_,@,+ . 和-个字符。
first_name 可选(blank=True),少于等于30个字符。
last_name 可选(blank=True),少于等于30个字符。
email 可选(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就是指定表头的展示文案
  • 自定义函数是针对list_display的, 添加了自定义函数之后, 还需要在list_display中添加

定制Admin

  • 我们需要操作的页面基本只有两种:
    • 数据批量展示和操作的列表页
    • 数据增加或者修改的编辑(新增)页

自定义函数-权限管理

  • SimpleListFilter: 提供和两个属性两个方法供我们重写:
    • 属性:
      • title: 用于展示标题
      • parameter_name: 就是查询时URL参数的名字
    • 方法:
      • lookups: 返回要展示的内容和查询的id
      • queryset: 根据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
    exclude = ('owner',)
    fieldsets = (
        (
            "基础配置", {
                "description": "基础配置描述",
                "fields": (
                    ('title', 'category'),
                    'status',
                ),
            }
        ), (
            "内容", {
                'fields': (
                    'desc', 'content'
                ),
            }
        ), (
            "额外信息", {
                'classes': ('collapse',),
                'fields': ('tags',),
            }
        )
    )

使用Xadmin

  1. 下载安装xadmin:pip install https://github.com/sshwsfc/xadmin/tarball/master
  2. 注册xadmin: ‘xadmin’,‘crispy_forms’,
  3. 把所有app中的admin.py改名xadmin.py
  4. 修改ModelAdmin的继承对象,继承自object或者去掉继承,自定义的site无法使用(不支持多site)
  5. admin.register ==> @xadmin.sites.register
  6. URL:url(r'^admin/', xadmin.site.urls, name="xadmin"),
  7. 标题:在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)

后台创建用户时,密码加密

0
  1. 支付宝打赏

    qrcode alipay
  2. 微信打赏

    qrcode weixin

评论区