【Django】Django4.1.2使用xadmin避坑指南(二)

简介: 【Django】Django4.1.2使用xadmin避坑指南(二)

环境

win10 python3.9.0 django4.1.2

问题一:if not ContentType._meta.installed:这一句报错:AttributeError: 'Options' object has no attribute 'installed'

我还研究了很久啥原因,看了看源码,后来直接看这段代码的意思,就是让把django.contrib.contenttypes安装到INSTALLED_APPS中,我检查了一下,安装了呀。
解决办法:直接注释掉,当然这样就没有检查安装django.contrib.contenttypes的过程了。

# if not ContentType._meta.installed:
#     raise ImproperlyConfigured("Put 'django.contrib.contenttypes' in "
#                                "your INSTALLED_APPS setting in order to use the admin application.")

看源码,Django 2.0.x的源码中Options是有这个属性方法的,3.2.x也有,4.0.x也有。

/django/db/models/options.py

@property
def installed(self):
    return self.app_config is not None

在Django的release note中没有看到提及,看GitHub的代码历史,是被移除了,说没用

问题二:TypeError: never_cache didn't receive an HttpRequest. If you are decorating a classmethod, be sure to use @method_decorator.

这个exception好像还没解决,点击这个链接反馈,加速fix

我是注释掉了:

        # if not hasattr(request, "META"):
        #     raise TypeError(
        #         "never_cache didn't receive an HttpRequest. If you are "
        #         "decorating a classmethod, be sure to use @method_decorator."
        #     )

问题三: return bool(self.request.is_ajax() or self.request.GET.get('_ajax'))报错:AttributeError: 'WSGIRequest' object has no attribute 'is_ajax'

这个Django 3.1的release note有提到

The HttpRequest.is_ajax() method is deprecated as it relied on a jQuery-specific way of signifying AJAX calls, while current usage tends to use the JavaScript Fetch API. Depending on your use case, you can either write your own AJAX detection method, or use the new HttpRequest.accepts() method if your code depends on the client Accept HTTP header.
If you are writing your own AJAX detection method, request.is_ajax() can be reproduced exactly as request.headers.get('x-requested-with') == 'XMLHttpRequest'.

可以像这样用,创建一个自定义函数,进行检查:

def is_ajax(request):
    return request.META.get('HTTP_X_REQUESTED_WITH') == 'XMLHttpRequest'

网上的例子:

from django.shortcuts import HttpResponse


def is_ajax(request):
    return request.META.get('HTTP_X_REQUESTED_WITH') == 'XMLHttpRequest'


def ajax_test(request):
    if is_ajax(request=request):
        message = "This is ajax"
    else:
        message = "Not ajax"
    return HttpResponse(message)

解决方法:

        # return bool(self.request.is_ajax() or self.request.GET.get('_ajax'))
        return bool(self.request.headers.get('x-requested-with') == 'XMLHttpRequest' or self.request.GET.get('_ajax'))

当我解决完这个问题的时候,真心建议别用Django4尝试搭配xadmin了。:cry:想完全适配没那么容易。

问题四:except models.FieldDoesNotExist:报错:AttributeError: module 'django.db.models' has no attribute 'FieldDoesNotExist'

解决方法:

最上面导包的代码
from django.core.exceptions import PermissionDenied, ObjectDoesNotExist
改成
from django.core.exceptions import PermissionDenied, ObjectDoesNotExist, FieldDoesNotExist
报错的那个位置改成
# except models.FieldDoesNotExist:
 except FieldDoesNotExist:

问题五:django.template.exceptions.TemplateSyntaxError: Invalid block tag on line 2: 'ifequal'. Did you forget to register or load this tag?

解决方法:找到报错的模板文件,我报错的是项目根路径/venv/Lib/site-packages/xadmin/templates/xadmin/includes/pagination.html

把ifequal a b 改成 if a == b
把endifequal 改成 endif

问题六:name 'smart_text' is not defined

在使用过程中还会有多处报这个错误,或者类似的,因为新的Django没有这个方法了,改成了force_strsmart_str。就照着下面对比着改,缺哪个改哪个。
解决方法:

from django.utils.encoding import force_str, smart_str
force_text = force_str
smart_text = smart_str

在这里插入图片描述
可以用了!

我把改好的xadmin源码上传了一份到GitHub上,希望能够给个star:star:!

Django4.1.2-xadmin

相关文章
|
10月前
|
数据库 Python
【Django】Django4.1.2使用xadmin避坑指南
【Django】Django4.1.2使用xadmin避坑指南
django2使用xadmin打造适合国人的后台管理系统(2)
在django2使用xadmin打造适合国人的后台管理系统(1)中已经集成好了xadmin,那么接下来就开始来使用xadmin以及做一些常用设置。 1.首先设置支持中文,修改settings文件中的 LANGUAGE_CODE = 'zh-hans', TIME_ZONE ='Asia/Shanghai'。
2406 0
|
Python 数据安全/隐私保护 前端开发
django2使用xadmin打造适合国人的后台管理系统(1)
       python火了之后,学习python的人也越来越多了,python做web开发的话,flask、django是比较火的框架了,django是一个比较大的框架,也是一个快速开发利器。
2232 0
|
Python 前端开发 数据库
Python3 | Django后台管理框架Xadmin安装指南
Django是python的重量级web框架,写得少,做得多,非常适合后端开发,它很大的一个亮点是,自带后台管理模块,但它自带的后台管理有点丑,而Xadmin是基于bootstrap开发的一套后台管理框架,界面非常美观,只需几步就可以替换自带的Dja...
2073 0
|
数据库 Python 关系型数据库
|
2天前
|
安全 数据库 C++
Python Web框架比较:Django vs Flask vs Pyramid
【4月更文挑战第9天】本文对比了Python三大Web框架Django、Flask和Pyramid。Django功能全面,适合快速开发,但学习曲线较陡;Flask轻量灵活,易于入门,但默认配置简单,需自行添加功能;Pyramid兼顾灵活性和可扩展性,适合不同规模项目,但社区及资源相对较少。选择框架应考虑项目需求和开发者偏好。
|
2天前
|
前端开发 UED Python
Wagtail-基于Python Django的内容管理系统CMS实现公网访问
Wagtail-基于Python Django的内容管理系统CMS实现公网访问
|
2天前
|
中间件 Python
中间件应用Django Middleware(Python)
【5月更文挑战第3天】中间件应用Django Middleware(Python)
36 6
中间件应用Django Middleware(Python)
|
2天前
|
运维 监控 Serverless
Serverless 应用引擎产品使用之阿里函数计算中在自定义环境下用debian10运行django,用官方层的python3.9,配置好环境变量后发现自定义层的django找不到了如何解决
阿里云Serverless 应用引擎(SAE)提供了完整的微服务应用生命周期管理能力,包括应用部署、服务治理、开发运维、资源管理等功能,并通过扩展功能支持多环境管理、API Gateway、事件驱动等高级应用场景,帮助企业快速构建、部署、运维和扩展微服务架构,实现Serverless化的应用部署与运维模式。以下是对SAE产品使用合集的概述,包括应用管理、服务治理、开发运维、资源管理等方面。
22 3
|
2天前
|
存储 搜索推荐 开发者
django-haystack,具有全文搜索功能的 Python 库!
django-haystack,具有全文搜索功能的 Python 库!
25 0