我正在关注 Django 1.6 的教程,其中包含一个模型 Poll ,它具有派生属性 was_published_recently ( class Poll 的方法)。该模型最初定义如下。

# polls/models.py (excerpted)

class Poll(models.Model):
    # ...
    def was_published_recently(self):
        return self.pub_date >= timezone.now() - datetime.timedelta(days=1)

这个应用程序的管理界面:
# polls/admin.py (excerpted)

class PollAdmin(admin.ModelAdmin):
    # ...
    list_display = ('question', 'pub_date', 'was_published_recently')

admin.site.register(Poll, PollAdmin)

现在我们要改进 was_published_recently 的显示和排序功能。

在教程中,文件 polls/models.py 已更新:
class Poll(models.Model):
    # ...
    was_published_recently.admin_order_field = 'pub_date'
    was_published_recently.boolean = True
    was_published_recently.short_description = 'Published recently?'

但是,我认为这在实践中可能还不够好,因为我们指定的完全是关于管理用户界面,而不是模型本身。所以我改为更新 polls/admin.py :
class PollAdmin(admin.ModelAdmin):
    Poll.was_published_recently.admin_order_field = 'pub_date'
    Poll.was_published_recently.boolean = True
    Poll.was_published_recently.short_description = 'Published recently?'
    # ...

在此修改后,该应用程序也按预期运行(多个民意调查也运行良好)。由于我是 Python 新手,我通过在 was_published_recentlyPoll 中打印 PollAdmin 来进一步调查:
class Poll(models.Model):
    # ...
    print("in class Poll", was_published_recently)

class PollAdmin(admin.ModelAdmin):
    print("in class PollAdmin", Poll.was_published_recently)
    # ...

输出是
in class Poll <function Poll.was_published_recently at 0x10fc92050>
in class PollAdmin <function Poll.was_published_recently at 0x10fc92050>

所以显然 was_published_recently 中的 class PollPoll.published_recently 中访问的 class PollAdmin 相同。

我的问题:我应该在 admin_order_field 还是 admin.py 中指定 models.py 内容?如果在 admin.py 而不是 models.py 中指定,有什么缺点吗?

最佳答案

简而言之,一切都按预期工作,将 admin_order_field 内容放在 models.pyadmin.py 中在语义上是相同的。



是的。他们应该是一样的。类是对象。所以 Poll 是一个对象。 Poll.was_published_recently 是对象 Poll 的属性,也是 instancemethod 类型的对象。无论您在何处访问它,它都是同一个对象。

AFAIK,在 admin_order_fieldmodels.py 中编写 admin.py 东西的唯一区别是解释顺序。 Django 在 models.py 之前加载 admin.py ,所以一切都在加载时运行,依赖 admin_order_field 的东西会失败。但由于 admin_order_field 仅用于 admin.py ,我认为你在做什么很好。

Python 非常动态,甚至允许您修改其他模块的定义。这可能会导致难以发现的错误和糟糕的可读性/可维护性。请务必谨慎使用此黑魔法。

关于python - Django 管理列表显示设置的替代代码位置,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20118322/

10-16 17:53