使用Django教程“编写自己的Django应用程序”,我正在Part 2。
中途,它指示我向管理员添加一行,以便管理员不仅可以识别Poll(和PollAdmin,教程已经为一些自定义的轮询呈现选项配置),还可以识别选择。这是(短)更新的admin.py:
from polls.models import Poll
from polls.models import Choice
from django.contrib import admin
class PollAdmin(admin.ModelAdmin):
fieldsets = [
(None, {'fields': ['question']}),
('Date information', {'fields': ['pub_date'], 'classes': ['collapse']}),
]
admin.site.register(Poll, PollAdmin)
admin.site.register(Choice)
看着这个,我无法弄清楚为什么我不能简单地写
admin.site.register(Poll, PollAdmin, Choice)
除了这给我一个TypeError,因为
register() takes at most 3 arguments (4 given)
这对我来说似乎真的......任意。我不明白为什么寄存器最多只需要3个参数。我对Django的理解仍然处于一个非常巫术的,货物崇拜的水平,所以我得到了这个Just。不。工作。但我想知道是否可以解释为什么我不能同时从admin.site中提取所有三个元素。
答案 0 :(得分:5)
因为这里有两种不同类型的注册,有两种不同类型的对象。我认为你在想这是“用管理员注册这三件事”,但这并不是正在发生的事情。
第一行是说“使用我定义的PollAdmin类向管理员注册民意调查模型。”
第二行是说“使用默认设置向管理员注册选择模型。”
因此将它们全部放在同一行中是没有意义的。您一次只注册一个模型,但一个使用一些显式选项,另一个使用默认选项。
答案 1 :(得分:1)
register
只接受一个或两个参数(第三个是self
,它由类自动传递)。如果指定一个参数,则它必须是模型类,Django管理员将只使用默认的ModelAdmin
。如果指定两个参数,则第一个必须是模型类,第二个必须是ModelAdmin
子类。
你不能随意地将参数传递给方法,每个参数意味着什么。
答案 2 :(得分:0)
试试这个:
from django.contrib import admin.site
register(Poll, PollAdmin, Choice)
假设您在“myclass”类中有一个方法,例如:
def example_method(param1,param2):
//do stuff
当您使用myclass.example_method(param2)
时,param1
被隐式传递给myclass
。
答案 3 :(得分:-1)
查看源代码。不是Django的东西,而是基本的Python。
注册方法:
def register(self, model_or_iterable, admin_class=None, **options):
"""
stuff to read
"""
#...code...
validate(admin_class, model)
self._registry[model] = admin_class(model, self)
启动ModelAdmin对象...
class ModelAdmin(BaseModelAdmin):
def __init__(self, model, admin_site):
self.model = model
self.opts = model._meta
self.admin_site = admin_site
super(ModelAdmin, self).__init__()
...如果您阅读“选项”的使用,是否可以解决错误,如果有人想要扩展ModelAdmin!像这样:
class MyModelAdmin(ModelAdmin):
def __init__(self, model, admin_site, my_param = None):
self.my_property = my_param
super(MyModelAdmin, self).__init__(model, admin_site)
如果你刚刚开始学习Django和Python,那么这类问题就完全没用了,而且效率很高!