1

处理 Django 教程“编写你自己的 Django 应用程序”,我在第 2 部分

在中途,它指示我向管理员添加一行,以便管理员不仅可以识别 Poll(和 PollAdmin,本教程一直在为一些自定义投票呈现选项配置),还可以识别 Choice。这是(简短的)更新的 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)

这似乎真的......对我来说是任意的。我不明白为什么 register 最多只接受 3 个参数。我对 Django 的理解仍然处于非常巫术、货物崇拜的水平,所以我明白了。没有。工作。但我想知道是否可以阐明为什么我不能同时从 admin.site 中提取所有三个元素。

4

4 回答 4

5

因为您在这里进行了两种不同类型的注册,以及两种不同类型的对象。我认为您认为这是在说“向管理员注册这三件事”,但事实并非如此。

第一行是“使用我定义的 PollAdmin 类向管理员注册 Poll 模型”。

第二行是“使用默认设置向管理员注册 Choice 模型”。

因此,将它们全部放在同一行中是没有意义的。您一次只注册一个模型,但一个使用一些显式选项,另一个使用默认选项。

于 2012-07-25T17:46:07.813 回答
1

register只接受一个或两个参数(第三个是self由类自动传递的)。如果您指定一个参数,它必须是一个模型类,Django 管理员将简单地使用ModelAdmin它的默认值。如果指定两个参数,第一个必须是模型类,第二个必须是ModelAdmin子类。

你不能随意地将参数传递给方法,每个参数都意味着一些东西

于 2012-07-25T17:48:26.830 回答
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.

于 2012-07-25T17:13:42.017 回答
-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,这类问题完全没有用,而且毫无意义!

于 2012-07-25T17:35:31.887 回答