我正在关注 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_recently
和 Poll
中打印 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 Poll
与 Poll.published_recently
中访问的 class PollAdmin
相同。我的问题:我应该在
admin_order_field
还是 admin.py
中指定 models.py
内容?如果在 admin.py
而不是 models.py
中指定,有什么缺点吗? 最佳答案
简而言之,一切都按预期工作,将 admin_order_field
内容放在 models.py
或 admin.py
中在语义上是相同的。
是的。他们应该是一样的。类是对象。所以 Poll
是一个对象。 Poll.was_published_recently
是对象 Poll
的属性,也是 instancemethod
类型的对象。无论您在何处访问它,它都是同一个对象。
AFAIK,在 admin_order_field
和 models.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/