Django开发博客系统(11-使用xadmin)

这段时间进行了前端页面的美化,实现了搜索功能与评论功能,以及配置了rss和sitemap,不过这些东西后期可能还会进行大改,所以暂时不准备讲,可能完成之后会一起说一下...吧.

另外这里贴上我的源码,不过还没有完成,有兴趣可以去看看.

今天将后台的admin替换为了xadmin,xadmin是国人创建的一个开源项目,作者github,这个项目简单来说可以完全无痛地替换admin,同时增加很多有用的功能,界面也是基于Bootstrap,相较自带的更美观.

先来看看最终完成的效果图吧

接下来就进行xadmin的配置.

安装

pip install https://codeload.github.com/sshwsfc/xadmin/zip/django2

在base.py中配置INSTALLED_APPS

1 INSTALLED_APPS = [
2     ...
3     ‘xadmin‘,
4     ‘crispy_forms‘,
5     ‘reversion‘,
6     ...
7 ]

接下来尝试创建迁移,会报一连串的错误,接下来一个个解决.

我的开发环境是:python3.8.0 + django3.0.4

1.ImportError: cannot import name ‘six‘ from ‘django.utils‘

找到six.py所在的位置并复制这个文件

把six.py复制到‘django.utils‘所在的路径

2.cannot import name ‘python_2_unicode_compatible‘ from ‘django.utils.encoding‘

找到路径中的models.py,把第十一行的

from django.utils.encoding import python_2_unicode_compatible, smart_text

替换为

1 from django.utils.encoding import smart_text
2 from six import python_2_unicode_compatible

3.ModuleNotFoundError: No module named ‘django.contrib.staticfiles.templatetags‘

找到util.py

找到这一行,将其替换为

from django.templatetags.static import static

执行迁移..

开始配置xadmin

1.在各个App中新建adminx.py文件,并把对应的admin.py中的内容复制过去

2.将我们定义的ModelAdmin的继承对象改为object或者去掉继承,这里我选择新建一个base_xadmin.py文件,内容与base_admin.py相同,只是把

class BaseOwnerAdmin(admin.ModelAdmin):
# 改为
class BaseOwnerAdmin:

有几个类是直接继承admin.ModelAdmin的,也需要去掉继承.

3.修改类中的内容

把fieldsets修改为Fieldsets

用PostAdmin来举例

 1 fieldsets = (
 2     (‘基础配置‘, {
 3         ‘description‘: ‘基础配置描述‘,
 4         ‘fields‘: (
 5             (‘title‘, ‘category‘),
 6             ‘status‘,
 7         ),
 8     }),
 9     (‘内容‘, {
10         ‘description‘: ‘摘要默认选取内容中的前140个字‘,
11         ‘fields‘: (
12             ‘desc‘,
13             ‘content‘,
14         ),
15     }),
16     (‘额外信息‘, {
17         ‘classes‘: (‘wide‘, ),
18         ‘fields‘: (‘tag‘, ),
19     }),
20 )

改为

 1 form_layout = (
 2     Fieldset(
 3         ‘基础信息‘,
 4         Row(‘title‘, ‘category‘),
 5         ‘status‘,
 6         ‘tag‘,
 7     ),
 8     Fieldset(
 9         ‘内容信息‘,
10         ‘desc‘,
11         ‘content‘,
12     )
13 )

自定义过滤器修改

之前我们在post中自定义了一个按照分类过滤的过滤器

 1 class CategoryOwnerFilter(admin.SimpleListFilter):
 2     """自定义过滤器只展示当前用户分类"""
 3
 4     title = ‘分类过滤器‘  # 标题
 5     parameter_name = ‘owner_category‘  # 查询时URL参数的名字
 6
 7     def lookups(self, request, model_admin):  # 返回要展示的内容和查询用的id
 8         return Category.objects.filter(owner=request.user).values_list(‘id‘, ‘name‘)
 9
10     def queryset(self, request, queryset):
11         category_id = self.value()
12         if category_id:
13             return queryset.filter(category_id=self.value())
14         return queryset

xadmin:

 1 class CategoryOwnerFilter(RelatedFieldListFilter):
 2     """自定义过滤器只展示当前用户分类"""
 3
 4     @classmethod
 5     def test(cls, field, request, params, model, admin_view, field_path):
 6         return field.name == ‘category‘
 7
 8     def __init__(self, field, request, params, model, model_admin, field_path):
 9         super(CategoryOwnerFilter, self).__init__(field, request, params, model, model_admin, field_path)
10         # 重新获取lookup_choices, 根据owner过滤
11         self.lookup_choices = Category.objects.filter(owner=request.user).values_list(‘id‘, ‘name‘)

同时PostAdmin中也需要修改:

list_filter = [CategoryOwnerFilter]  # 页面过滤器

# 改为

list_filter = [‘category‘]  # 页面过滤器

其中,test方法的作用是确认字段是否需要被当前的过滤器过滤.

在__init__方法中,我们执行完父类的__init__后,重新定义了lookup_choices的值,这个值默认是查询所有数据.

操作配置

1 def operator(self, obj):
2     return format_html(
3         ‘<a href="{}">编辑</a>‘,
4         reverse(‘cus_admin:blogApp_post_change‘, args=(obj.id,))
5     )
6 operator.short_description = ‘操作‘

改为

1 def operator(self, obj):
2     return format_html(
3         ‘<a href="{}">编辑</a>‘,
4         self.model_admin_url(‘change‘, obj.id)
5     )
6 operator.short_description = ‘操作‘

装饰器

@admin.register(Post, site=custom_site)

改为

@xadmin.sites.register(Post)

其他修改与Post类似

添加路由

path(‘xadmin/‘, xadmin.site.urls, name=‘xadmin‘),

这时使用的时候发现又能看到其他用户的文章了,这是因为接口存在差异,BaseOwnerAdmin中的

1 def get_queryset(self, request):
2     qs = super(BaseOwnerAdmin, self).get_queryset(request)
3     return qs.filter(owner=request.user)
4
5 def save_model(self, request, obj, form, change):
6     obj.owner = request.user
7     return super(BaseOwnerAdmin, self).save_model(request, obj, form, change)

需要改为

1 def get_list_queryset(self):
2     request = self.request
3     qs = super().get_list_queryset()
4     return qs.filter(owner=request.user)
5
6 def save_models(self):
7     self.new_obj.owner = self.request.user
8     return super().save_model()

另外在在xadmin中,我们可以在settings中来自定义系统名称和footer需要展示的内容.

settings/base.py

1 XADMIN_TITLE = ‘Blog管理后台‘
2 XADMIN_FOOTER_TITLE = ‘power by ylnx2000.cn‘

xadmin也自带了log功能,所以我们可以删掉LogEntryAdmin.

xadmin还有很多功能,想要熟悉的话最好还是通过手册与阅读源码来了解

另外我在使用xadmin时,

1 # @property
2     # def media(self):
3     #     media = super().media
4     #     media.add_js([‘https://cdn.bootcss.com/twitter-bootstrap/4.4.0/js/bootstrap.bundle.js‘])
5     #     media.add_css({
6     #         ‘all‘: (‘https://cdn.bootcss.com/twitter-bootstrap/4.3.1/css/bootstrap.min.css‘,),
7     #     })
8     #     return media

在PostAdmin中使用静态资源会出现

在百度中是说需要替换util.py中的内容,但我发现那里面

内容没错,所以报错的原因似乎不一样,这里我还没有解决,希望能得到解答.

原文地址:https://www.cnblogs.com/ylnx-tl/p/12676957.html

时间: 2024-10-27 18:02:21

Django开发博客系统(11-使用xadmin)的相关文章

Django开发博客系统(01-前言与需求分析)

原本是跟着视频学,无奈发现视频中用到的资源找不到,于是自己买了本书来进行学习,贴上JD链接.<Django企业开发实战> 我的开发环境是win10+python3.8+django3.0.4,而书上是在linux环境下进行开发的,= =(汗),先这样学下去吧,毕竟面向百度编程.写博客也是为了督促一下自己,毕竟在家里宅着容易学着学着就玩手机去了.. 书前面还有一些入门知识,这里我就直接跳到做项目的部分了. 目标是开发一个博客系统, 需求分析: 简单来说,博客分为两个部分:读者访问部分(用户端)和

Django开发博客系统(04-常用字段与属性)

Django models中常用的字段类型 数值型 这些类型都是数值相关的. l  AutoField int(11). 自增主键,Django Model默认提供,可以被重写.完整定义是 id = models.AutoField(primary_key=True) l  BooleanFueld tinyint(1). 布尔类型字段,一般用于记录状态标记. l  DecimalField decimal. 开发对数据精度要求高的业务时考虑使用,比如做支付相关,金融相关.定义时需要指定精确到多

Django开发博客系统(08-路由配置与views编写)

我们需要的页面: l  博客首页 l  博文详情页 l  分类列表页 l  标签列表页 l  友链展示页 但实际上,博客首页,分类列表页和标签列表页,本质上都是文章列表页,只有一些信息有差别.那么View大概就有三类: l  列表页: 根据不同的查询条件分别展示博客首页,分类列表页和标签列表页 l  博文详情页: 展示博文详情页 l  友链展示页: 展示所有友情链接 书上使用的环境是django1.11.1,而我使用的是3.0.4,所以路由我使用path来写,并且把路由分散开来写,让代码分工能明

Django开发博客系统(07-根据需求定制管理后台)

运行系统尝试添加用户并添加数据,出现的效果 可以看到当前登录的用户虽然是DOCTOR,但依然可以看到其他用户的文章,而且过滤器上也展示了非当前用户创建的分类,显然这是一个需要我们解决的问题. 首先解决右侧过滤器的功能,这时需要自定义过滤器,这里贴上文档中的说明 接下来我们就来编写自定义过滤器的代码: 1 class CategoryOwnerFilter(admin.SimpleListFilter): 2 """自定义过滤器只展示当前用户分类""&quo

Django开发博客系统(05-QuerySet的使用)

在Model层中,Django通过objects属性来提供数据操作的接口, 比如我们想要查询所有文章的数据,只需要 Post.objects.all() 他会返回一个QuerySet对象,当我们需要用到它时,它会去db中获取数据,注意是用到的时候才会去查,而不是定义的时候去查,原因是QuerySet要支持链式操作,如果每次执行都要查询数据库的话,会影响性能,假设我要查询所有文章中状态为正常的文章,有如下代码. posts = Post.objects.all() available_posts

Django开发博客(基础篇)

Django开发博客(基础篇)http://www.itmin.cn/archives/918

Django开发博客- 部署

安装Git Git是一个被大量程序员使用的”版本控制系统”.此软件可以跟踪任何时间文件的改变,这样你以后可以随时召回某个特定版本. windows系统下面可以下载git-scm安装.除了第5步”Adjusting your PATH environment”, 需要选择”Run Git and associated Unix tools from the Windows command-line”(底部的选项).除此之外,默认值都没有问题. Linux系统的安装使用包管理器安装 123 sudo

Django开发博客 入门篇

Django是神马? Django是一个开源免费的Web框架,使用Python编写.能够让你快速写出一个Web应用, 因为它包含了绝大部分的组件,比如认证,表单,ORM,Session,安全,文件上传,页面模板等,避免了重复造轮子. 官方网站:https://www.djangoproject.com/ 笔者写这篇教程的时候,最新版本是1.9 安装Django1.9 安装python虚拟环境 为了开发应用的时候使用单独的环境,最好是安装virtual environment, 这样有很好的独立性

Django开发博客- 三部曲

其实在django中实现一个功能只需要三个步骤即可,这里我姑且叫它三部曲. 这三部曲就是: 定义urls映射 定义views 定义templates 什么是URL? URL就算一个WEB地址,你在浏览器输入这个地址,然后浏览器返回相应的网页给你. 比如http://djangogirls.com是一个URL,而127.0.0.1:8000同样也是个URL,默认就是http协议的. Django中的URL工作原理 我们打开mysite/urls.py文件,会发现类似下面这样: 1234567891