2012-07-25 19 views
1

使用Django教程「編寫自己的Django應用程序」,我在Part 2上。Django文檔第2部分:爲什麼我不能在一行中導入Poll,PollAdmin和Choices?

中途,它指示我向管理員添加一行,以便管理員不僅可以識別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) 

除了這給了我一個類型錯誤,因爲

register() takes at most 3 arguments (4 given) 

這看起來對我來說真的很隨意。我不明白爲什麼註冊只需要最多3個參數。我對Django的理解仍然是一個非常巫術,貨運邪教的水平,所以我明白這一點。不。工作,但我想知道是否可以解釋爲什麼我無法同時從admin.site中提取所有三個元素。

回答

5

因爲你有兩種不同的註冊類型,這裏有兩種不同類型的對象。我認爲你認爲這是說「向管理員註冊這三件事情」,但這並不是什麼事情。

第一行是說「使用我定義的PollAdmin類向管理員註冊輪詢模型」。

第二行是說「使用默認設置向admin註冊Choice模型」。

因此,將它們放在同一行是沒有意義的。您一次只能註冊一個模型,但一個使用某些顯式選項,而另一個使用默認選項。

+0

你明白我不理解 - 我確實認爲這是一個註冊與管理員的所有事情,而不是使用PollAdmin類註冊Poll。感謝您的簡短而有力的解釋。 – JeanSibelius 2012-07-26 00:15:26

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

-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,這種問題是完全沒用的和非生產性的!

1

register只接受一個或兩個參數(第三個是由類自動傳遞的self)。如果你指定了一個參數,它必須是一個模型類,並且Django管理員只會使用默認的ModelAdmin。如果指定了兩個參數,第一個必須是模型類,第二個參數必須是ModelAdmin子類。

你不能只是任意傳遞參數給方法,每個參數意味着什麼

相關問題