辽宁快乐12预测任3:the5fire的技术博客

彩票开奖查询 www.8a72.cn 关注Python、Django、Vim、Linux、Web开发、团队管理和互联网--Life is short, we need Python.


autocomplete light配置xadmin使用时一记小坑

作者:the5fire | 标签:         | 发布:2018-01-21 9:42 a.m. | 阅读量: 2917, 1302

昨天又有一个同学反馈,跟着视频写代码,一样的代码,但是为啥我这的autocomplete light就不生效。第一个同学反馈我以为是autocomplete light的版本问题,再次有人反馈,那可能是哪不太对劲。

说句题外话,默认情况下的django admin或者是xadmin,在外键字段的渲染上都是一个坑。当外键的数量过大,那页面的加载速度真是“杠杠滴”。

出错现象

先说下版本:xadmin-0.6.1 autocomplete light-3.2.10

错误提示:

Uncaught Error: Option 'ajax' is not allowed for Select2 when attached to a <select> element.
    at String.<anonymous> (select2.js:729)

你要是搜的话多半能发现这是版本问题,但是你看了看autocomplete light里面用到select2是一个挺新的版本,而报错的这个版本是3.x的版本。

autocomplate light和xadmin都是用select2这个js库。

问题原因

其实稍微仔细点排查的话,会发现错误的这个js是xadmin加载的资源,而不是autocomplete light加载的资源。这看起来有点奇怪了,我这里没出问题,但是其他人那里一样的代码会出问题。

首先的原因可能就是我们的版本不一样。But,确认后发现版本一样。

那么就是另外的原因,有细微的差别。于是我看了下network里面js的加载顺序,我这里是先加载autocomplete light的select2的资源,然后再加载xadmin自己的。

而其他人那边刚好相反,所以问题在这。实话实说,这种远程口头指挥排错的方式确实很有局限性。因为我不确定对方的代码到底是怎么写的。即便是跟着我的视频写出来的。(虽然可以从github上copy源码,但我还是强烈推荐自己跟着视频敲,遇到的问题越多,经验才越丰富)。

课程中有讲过INSTALLED_APPS的顺序会导致同名资源的加载顺序,测试了下发现不是同名资源。那么就是另外的问题。

仔细思考下Django admin部分或者说xadmin的部分是如何渲染页面的,它怎么知道把Charfield渲染为Input标签,把TextField渲染为Textarea标签?另外这些标签所依赖的资源,比如css和js,是怎么组织的?

在Django的源码中,有这样的一个概念(:-) 我自己总结的)—— 自治。

什么是自治呢?通俗来说就是高内聚,翻译成大白话来说就是能自己搞定的事就别麻烦别人。所以从更大的粒度来看,Django项目的每个APP都应该是自治的,避免相互依赖。

继续说回到问题,我们知道Django的渲染出来的资源是依据这个model或者modelform定义的field中的widget,那么对于我们遇到的问题 —— js资源的加载顺序,原因就是字段的加载顺序。

在Django的源码中: django/forms/forms.py的BaseForm.media的代码能够查看field的组织顺序:

# django.forms.forms.BaseForm部分代码

@property
def media(self):
    """
        Provide a description of all media required to render the widgets on this form
    """
    media = Media()
    print(self.fields)
    for field in self.fields.values():
        # import pdb;pdb.set_trace()
        media = media + field.widget.media
        print(media._js)
    return media

让出问题的同学在这加上两个print之后,能更好的发现问题。

解决方案

上面的fields的来源也是有点复杂,这里不过多展开,不过解决方案很简单,就是在form的Meta中自定义fields,像这样:

class PostAdminForm(forms.ModelForm):
    ...
    ... 省略代码

    class Meta:
        model = Post
        fields = ()  #  你需要定义的字段,按照顺序

保证autocomplete light字段在其他的带choices配置的字段之前。不过,这样的解决方案会限制你页面的布局,比如你可能就像把那个字段放到autocomplete light的字段之前,怎么解决?

上面也说到了,INSTALLED_APPS的配置顺序会影响静态资源的加载顺序,所以,根据路径在你的app里面配置同样目录名称的资源,来进行覆盖。

总结

最终其实发现这个同学的form和adminx的代码跟我的一样,但是model中字段定义的顺序不同,所以导致这个问题。不过对于遇到这样问题的同学来说,如果能搞明白原因,是很有帮助的。

- from www.8a72.cn
----EOF-----

微信公众号:Python程序员杂谈

预售优惠价截止到7月8日23点59分。


其他分类:
  • 女子谎称刷单提成骗贫困大学生16万 用于买化妆品 2018-12-01
  • 西安体育学院体育传媒系与西部网签约校媒合作 2018-12-01
  • 网络投票刷礼物能不能帮孩子“争上游”? 2018-11-28
  • 中共山西省委组织部公示 2018-11-28
  • 【北京天气】最新北京今天天气,实时提供北京气温、空气质量、24小时天气预报、生活指数查询 2018-11-24
  • 格局生变 内容产业未来何去何从 2018-08-18
  • 土地不是劳动成果,而是一种自然资源,就像空气、阳光不是劳动成果而是自然资源一样,所以土地不具有价值,买房只应支付房屋费,不应该支付土地费。 2018-08-14
  • 安全生产月:铁路安全宣传走进车站 2018-08-02
  • 带动乡亲干 各自有实招——三位农村社区党组织书记的故事 2018-08-02
  • 长江中下游正式“入梅”!中东部高温降雨齐上阵 湖北中北部有大到暴雨 2018-07-31
  • 2018年4月27日划拨国家社科基金项目鉴定费名单(2) 2018-07-31
  • [微笑]未来的社会,必然是按需(基本需求)分配+按劳(劳动价值或劳动能力)分配相联合的混合分配方式。 2018-07-30
  • “一带一路”建设工作座谈会 2018-07-30
  • 只要等一等就能多“等”出8600万美元! 2018-07-29
  • 2017年秋季学期学员第十三支部风采 2018-07-18
  • 101| 454| 992| 649| 55| 359| 642| 99| 760| 320|