2011-06-21 25 views
16

我有幾個Customer誰預訂Appointment s。每個Appointment只有一個客戶,但可以預訂一個客戶以進行多個不同時間的約會。Django Admin的內聯式解決方案,其中Admin包含ForeignKey到其他模型

class Customer(model.Model): 
    def __unicode__(self): 
     return u'%s' % (self.name,) 
    name = models.CharField(max_length=30) 
    # and about ten other fields I'd like to see from the admin view. 

class Appointment(models.Model): 
    datetime = models.DateTimeField() 
    customer = models.ForeignKey("Customer") 
    class Meta: 
     ordering = ('datetime',) 

現在,當管理員的推移(按時間排序)看任命的admin通過時間表瀏覽,有時候他們想看到誰擁有一定的預約客戶信息。現在,他們必須記住客戶的姓名,從約會導航到客戶管理頁面,找到記住的客戶,然後才能瀏覽他們的信息。

理想情況下,管理內聯的東西會很棒。但是,如果CustomerForeignKey("Appointment"),我似乎只能在Appointment管理頁面上創建CustomerInline。 (Django專門給我一個錯誤,說Customer沒有ForeignKey到Appointment)。有誰知道類似的功能,但是當AppointmentForeignKey('Customer')

注:我簡化了模型;除了名稱(一些自由文本)之外,實際的客戶字段目前大約有約10個字段,因此將所有信息放在__unicode__中將是不切實際的。

回答

4

完成@約翰answer從上面 - 定義你想看到在您的變更列表的內容:

return '<a href="%s">%s</a>' % (
        reverse('admin:applabel_customer_change', (self.customer.id,)), 
        self.customer.name # add more stuff here 
      ) 

並把它添加到的變化形式,請參閱:Add custom html between two model fields in Django admin's change_form

+3

它看起來像在某個時候Django添加['ModelAdmin.list_display_links'](https://docs.djangoproject.com/en/1.7/ref/contrib/admin/#django.contrib.admin.ModelAdmin.list_display_links)抽象出解決方案的代碼。 – MrColes

7

有沒有簡單的方法與django做到這一點。內聯被設計爲追蹤關係。

潛在的最佳替代方法是提供一個鏈接到用戶對象。在列表視圖中,這是非常簡單的:

添加的方法,以您的預約模式,如:

def customer_admin_link(self): 
    return '<a href="%s">Customer</a>' % reverse('admin:app_label_customer_change %s') % self.id 
customer_admin_link.allow_tags = True 
customer_admin_link.short_description = 'Customer' 

然後在您的ModelAdmin加:

list_display = (..., 'customer_admin_link', ...) 

另一種解決方案來獲得正是你」重新尋找更復雜的代價是定義一個自定義管理模板。如果你這樣做,你基本上可以做任何事情。以下是我之前用來解釋的指南: http://www.unessa.net/en/hoyci/2006/12/custom-admin-templates/

基本上從django源文件中複製變更表單並添加代碼以顯示客戶信息。

+0

Thanks!對於有價值的信息,但做完所有這些事情後,我得到錯誤 ** AttributeError:'NoneType'對象沒有屬性'id'**另外,提供的鏈接不工作:( – stillfool

1

在的ModelAdmin類對於您的約會,您應該聲明以下方法:

class MySuperModelAdmin(admin.ModelAdmin): 
    def get_form(self, request, obj=None, **kwargs): 

    if obj: 
     # create your own model admin instance here, because you will have the Customer's 
     # id so you know which instance to fetch 
     # something like the following 
     inline_instance = MyModelAdminInline(self.model, self.admin_site) 
     self.inline_instances = [inline_instance] 

    return super(MySuperModelAdmin, self).get_form(request, obj, **kwargs) 

欲瞭解更多信息,這個功能可以讓你瞭解你將訪問的內容。

https://code.djangoproject.com/browser/django/trunk/django/contrib/admin/options.py#L423

+0

什麼MyModelAdminInline是基於什麼?它是擴展一個Inline類還是ModelAdmin類?(我已經嘗試了兩種方法,但是一直沿着X的方向獲取錯誤是不可調用的,沒有屬性'_meta',添加__call實現有助於有點但我不知道要創建/返回什麼)。例如MyModelAdminInline會很有幫助! – owenfi