django入門-自定義管理介面-part7

曲珂發表於2017-03-08

尊重作者的勞動,轉載請註明作者及原文地址 http://www.cnblogs.com/txwsqk/p/6522854.html 

完全翻譯自官方文件 https://docs.djangoproject.com/en/1.10/intro/tutorial07/

在上一節中我們把Question加入到了admin的後臺管理中,你肯定想更改admin的顯示介面,重新編輯一下admin.py

from django.contrib import admin

from .models import Question


class QuestionAdmin(admin.ModelAdmin):
    fields = ['pub_date', 'question_text']

admin.site.register(Question, QuestionAdmin)

看到變化了嗎,多顯示了兩個欄位

再修改一下

from django.contrib import admin

from .models import Question


class QuestionAdmin(admin.ModelAdmin):
    fieldsets = [
        (None,               {'fields': ['question_text']}),
        ('Date information', {'fields': ['pub_date']}),
    ]

admin.site.register(Question, QuestionAdmin)

圖我就不貼了,想看想過的去看官方文件吧

Question和Choice應該是由關聯的,我們應該把她們展示在一個頁面

我們把Choice也加入到admin介面

admin.site.register(Choice)

Choice和Question是外來鍵關聯的ForeignKey,django把Question顯示成了一個下拉選單的形式讓你選擇

現在我們只能在Choice和Question各自的頁面新增,下面我們把他們放在一個頁面

from django.contrib import admin

from .models import Choice, Question


class ChoiceInline(admin.StackedInline):
    model = Choice
    extra = 3


class QuestionAdmin(admin.ModelAdmin):
    fieldsets = [
        (None,               {'fields': ['question_text']}),
        ('Date information', {'fields': ['pub_date'], 'classes': ['collapse']}),
    ]
    inlines = [ChoiceInline]

admin.site.register(Question, QuestionAdmin)

我們在Question頁面,設定了展示3個Choice,你會發現頁面現在有點長了,讓它展示的緊湊一些,修改一下這裡

class ChoiceInline(admin.TabularInline):  #就是括號裡面的

下面在來改變一下admin的修改頁面,預設django展示model的__str__,我們在admin.py裡新增list_display

class QuestionAdmin(admin.ModelAdmin):
    
    list_display = ('question_text', 'pub_date', 'was_published_recently')

想更改顯示內容的排序結果和欄位名稱

class Question(models.Model):
    # ...
    def was_published_recently(self):
        now = timezone.now()
        return now - datetime.timedelta(days=1) <= self.pub_date <= now
    was_published_recently.admin_order_field = 'pub_date'
    was_published_recently.boolean = True
    was_published_recently.short_description = 'Published recently?'

admin還能對為日期新增過濾器,還能給加搜尋框,只需要在你的admin.py里加上

list_filter = ['pub_date']
search_fields = ['question_text']

 下面講如何自定義admin的模板

在你的專案目錄(跟manager.py一個層級)建立一個資料夾叫templates,其實這個目錄可以建立在任何位置,放在專案目錄裡更方便而已.

編輯你的settings.py

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR, 'templates')],  # 就是這裡,django會從這些目錄的位置載入你的模板
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

再在templates裡建立admin/templates, 拷貝admin/base_site.html到你新建立的目錄裡,admin/base_site.html這個目錄在哪裡呢

>>> import django
>>> django.__path__
['/Users/quke/PycharmProjects/myPythonEnv/lib/python2.7/site-packages/Django-1.10.5-py2.7.egg/django']

就在上面這個目錄的contrib/admin/templates

我們先把後臺管理介面的header改一下,編輯base_site.html,檔案內容如下

{% extends "admin/base.html" %}

{% block title %}{{ title }} | {{ site_title|default:_('Django site admin') }}{% endblock %}

{% block branding %}
<h1 id="site-name"><a href="{% url 'admin:index' %}">{{ site_header|default:_('Django administration') }}</a></h1>
{% endblock %}

{% block nav-global %}{% endblock %}

你可以直接把裡面的字串修改成你想要的

說一個我自己用過的admin的模板工具django suit 介面更好看 推薦 

http://djangosuit.com/

相關文章