Django文档第2部分:为什么我不能在一行中导入Poll,PollAdmin和Choices?

时间:2012-07-25 17:08:44

标签: django

使用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中提取所有三个元素。

4 个答案:

答案 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,那么这类问题就完全没用了,而且效率很高!