码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 【Django】Django4.1.2使用xadmin避坑指南(二)


    上一篇【Django】Django4.1.2使用xadmin避坑指南调完后,还是继续有问题,没事,咱们继续,必须啃下硬骨头~

    文章目录

      • 环境
      • 问题一:if not ContentType._meta.installed:这一句报错:AttributeError: 'Options' object has no attribute 'installed'
      • 问题二: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'
      • 问题四:except models.FieldDoesNotExist:报错:AttributeError: module 'django.db.models' has no attribute 'FieldDoesNotExist'
      • 问题五:django.template.exceptions.TemplateSyntaxError: Invalid block tag on line 2: 'ifequal'. Did you forget to register or load this tag?
      • 问题六:name 'smart_text' is not defined

    环境

    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.")
    
    • 1
    • 2
    • 3

    看源码,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
    
    • 1
    • 2
    • 3

    在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."
            #     )
    
    • 1
    • 2
    • 3
    • 4
    • 5

    问题三: 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'
    
    
    • 1
    • 2
    • 3

    网上的例子:

    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)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    解决方法:

            # 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'))
    
    • 1
    • 2

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

    问题四: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
    
    • 1
    • 2
    • 3
    • 4
    报错的那个位置改成
    # except models.FieldDoesNotExist:
     except FieldDoesNotExist:
    
    • 1
    • 2
    • 3

    问题五: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
    
    • 1
    • 2

    问题六:name ‘smart_text’ is not defined

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

    from django.utils.encoding import force_str, smart_str
    force_text = force_str
    smart_text = smart_str
    
    • 1
    • 2
    • 3

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

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

    Django4.1.2-xadmin

  • 相关阅读:
    Swagger(3):Swagger入门案例
    常见外贸英语缩写词
    SQL: 索引原理与创建索引的规范
    CANoe-什么是Vector Tool Platform(全网唯一讲明白的文章)
    python多线程操作
    逆向学习记录(4)adb
    JavaScript的DOM技术
    基于html的美食网站 奶茶网页设计与实现(HTML+CSS+JavaScript)
    kafka消费者程序日志报错Offset commit failed问题研究
    分布式与一致性协议之CAP(三)
  • 原文地址:https://blog.csdn.net/chengyikang20/article/details/127979799
  • 最新文章
  • 【JVM】编译执行与解释执行的区别是什么?JVM 使用哪种方式?
    用 Hashids 优雅解决 C 端自增 ID 暴露问题
    V8引擎 精品漫游指南--Ignition篇(上) 指令 栈帧 槽位 调用约定 内存布局 基础内容
    LLVM Pass快速入门(四):代码插桩
    milkup:桌面端 markdown AI续写和即时渲染
    基于项目工程构建SBOM(软件物料清单)的研究
    鸿蒙应用开发UI基础第二节:鸿蒙应用程序框架核心解析与实操
    .NET 中如何快速实现 List 集合去重?
    扣子Coze实战:从0到1打造抖音+小红书热点监控智能体
    浅谈数据访问层
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
小工具 小游戏
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1

京公网安备 11010502049817号