2011-09-21 33 views

回答

12

我想爲我的網站提供相同的功能,並通過對核心django系統進行輕微修改來添加它。

第1步: 首先,我們需要一種方法來指示哪些模型應該列出其屬性。下面的代碼添加到您要上市(在models.py)的情況下,車型:

class Meta: 
    list_instances = True 

第2步: 我們需要修改Django的認讀這個新屬性。在覈 - django的文件:分貝/模型/ options.py,大致在22行追加「list_instances」到DEFAULT_NAMES:

DEFAULT_NAMES = ('verbose_name', 'verbose_name_plural', 'db_table', 'ordering', 
      'unique_together', 'permissions', 'get_latest_by', 
      'order_with_respect_to', 'app_label', 'db_tablespace', 
      'abstract', 'managed', 'proxy', 'auto_created', 'list_instances') 

和在同一文件中,大致在管路52中,創建一個默認字段該屬性之後其他屬性:

self.list_instances = False 

步驟3: 我們需要一起生成的索引頁面模板傳遞這一信息。在覈心的Django文件:contrib請/管理/ sites.py,內index()方法和裏面的「如果has_module_perms:」部分,添加以下代碼:

instances = [] 
if (model._meta.list_instances == True): 
    instances = model_admin.queryset(None) 

這將創建實例的列表顯示但只有在設置了list_instance屬性的情況下。在同一個文件中,再往下走幾行,將這些值附加到「model_dict」結構中。

model_dict = { 
    'name': capfirst(model._meta.verbose_name_plural), 
    'admin_url': mark_safe('%s/%s/' % (app_label, model. __name__.lower())), 
    'perms': perms, 
    'list_instances':model._meta.list_instances, 
    'instances': instances, 
} 

步驟4: 的最後一步是修改的模板來支持這一點。編輯core-django文件/contrib/admin/templates/admin/index.html或將此文件複製到特定應用程序的templates/admin /目錄。在生成行的標準代碼之後添加幾行以生成「子行」(如果適用)。大致在線路40,右之間「/ TR>」和「{%ENDFOR%}」:

{% if model.list_instances %} 
    {% for instance in model.instances %} 
    <tr> 
     <td colspan="2" style="padding-left: 2em;">{{ instance }}</td> 
     {% if model.perms.change %} 
      <td><a href="{{ model.admin_url }}{{ instance.id }}/" class="changelink">{% trans 'Change' %}</a></td> 
     {% else %} 
      <td>&nbsp;</td> 
     {% endif %} 
    </tr> 
    {% endfor %} 
{% endif %} 

這將導致物品與)在由的unicode(產生的名稱的方法被列出模型。

第5步: 瞧!它應該是這個樣子:

enter image description here

編輯: 可選步驟6: 如果您希望實例名稱可點擊過,只是改變了模板(的index.html)和替換:

<td colspan="2" style="padding-left: 2em;">{{ instance }}</td> 

有:

<td colspan="2" style="padding-left: 2em;">   
    {% if model.perms.change %}    
     <a href="{{ model.admin_url }}{{ instance.id}}">{{ instance }}</a> 
    {% else %} 
     {{ instance }} 
    {% endif %} 
</td> 
+0

不錯的解釋!謝謝!! – Nava

+1

你曾經像老師一樣教過;-)再次感謝。 – Nava

+2

沒問題。 :)我自己也需要它。如果你還希望點擊你特定的應用程序時,再次訪問contrib/admin/sites.py,並將與index()方法中相同的幾行添加到app_index()方法中。 – Setomidor

1

您可以通過改變各種管理模板做到這一點 - 根的一個被稱爲app_index.html和控制什麼被顯示在那裏。研究發生什麼事的最好方法是安裝django-debug-toolbar,然後查看用於每個視圖的模板以瞭解如何自定義。

+1

完全正確......但這是一條長長的黑暗道路去下,我已經嘗試過了。 django-admin並不是特別模塊化或可擴展的。你完全確定用戶不能直接點擊其中一個鏈接嗎? – Dave

0

UPDATE硒tomidor回答django 10

總是很高興回到這個乾淨的解決方案!

步驟2 - 它是圍繞線125(是52)

步驟3 - 在sites.py - 更新新方法 -

_build_app_dict 

內部的for循環:for model, model_admin in models.items():

添加步驟3,因爲上述線路430和460周圍有所示

instances = [] 


if (model._meta.list_instances == True): 
    instances = model_admin.get_queryset(None) 
相關問題