1

Django チュートリアル「Writing your own Django app」に取り組んでおり、パート 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から3つの要素すべてを同時にプルできない理由に光を当てることができるかどうか疑問に思っていました.

4

4 に答える 4

5

ここでは、2つの異なるタイプのオブジェクトを使用して、2つの異なるタイプの登録が行われているためです。これは「これら3つを管理者に登録する」ということだとお考えの方もいらっしゃると思いますが、そうではありません。

最初の行は、「私が定義したPollAdminクラスを使用して、Pollモデルを管理者に登録する」と言っています。

2行目は、「デフォルト設定を使用して、Choiceモデルを管理者に登録する」と言っています。

したがって、それらをすべて同じ行に配置することは意味がありません。一度に登録するモデルは1つだけですが、1つはいくつかの明示的なオプションを使用し、もう1つはデフォルトのオプションを使用します。

于 2012-07-25T17:46:07.813 に答える
1

register1 つまたは 2 つの引数のみを受け入れます (3 番目の引数はself、クラスによって自動的に渡されます)。1 つの引数を指定する場合、それはモデル クラスである必要があり、Django 管理者は単純にデフォルトModelAdminを使用します。ModelAdmin2 つの引数を指定する場合、最初の引数はモデル クラスで、2 番目の引数はサブクラスでなければなりません。

メソッドに引数を勝手に渡し続けることはできません。各引数は何かを意味します

于 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 に答える