python web開發——Django後臺管理
阿新 • • 發佈:2019-01-07
Django 管理後臺
Django自帶了管理後臺,而且非常強大,這個模組是settings.py 中配置的django.contrib.admin應用。
建立一個管理員使用者
我們首先來建立一個後臺管理員使用者,併為其設定密碼。
建立賬號:
python manage.py createsuperuser
會要求我們輸入使用者名稱、郵箱和密碼。
建立好之後,啟動伺服器:
python manage.py runserver
在瀏覽器中輸入如下地址:
進入管理後臺登陸介面,輸入剛才設定的使用者名稱和密碼就可以登陸了。
讓我們自己的應用可以在後臺管理
開啟polls/admin.py輸入如下程式碼:
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.contrib import admin
from .models import Question
# Register your models here.
admin.site.register(Question)
這樣在後臺我們就可以編輯我們的Question了。
自定義管理表單
調整欄位順序
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.contrib import admin
from .models import Question
# Register your models here.
class QuestionAdmin(admin.ModelAdmin):
fields = ['pub_date','question_text']
admin.site.register(Question,QuestionAdmin)
這樣可以先新增日期,後新增問題內容。
對欄位分組
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.contrib import admin
from .models import Question
# Register your models here.
class QuestionAdmin(admin.ModelAdmin):
#fields = ['pub_date','question_text']
fieldsets = [
(None, {'fields':['question_text']},
'Date information',{'fields':['pub_date']}),
]
admin.site.register(Question,QuestionAdmin)
每個欄位集指定HTML樣式類
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.contrib import admin
from .models import Question
# Register your models here.
class QuestionAdmin(admin.ModelAdmin):
# fields = ['pub_date','question_text']
fieldsets = [
(None, {'fields':['question_text']},
'Date information',{'fields':['pub_date'],'classes':['collapse']}),
]
admin.site.register(Question,QuestionAdmin)
新增關聯物件
好了,我們已經有自己的Question管理介面。 但是一個Question有多個Choices,管理介面中並沒有將選項顯示出來。
有兩種方法來解決這個問題:
1.第一種是像我們為Question做的一樣,在管理站點中註冊Choice
# -*- coding: utf-8 -*-
from django.contrib import admin
from .models import Question
# Register your models here.
admin.site.register(Question)
admin.site.register(Choice)
2.在新增Question時新增Choice
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.contrib import admin
from .models import Question
# Register your models here.
class ChoiceInine(admin.StackedInline):
model = Choice
extra = 3
class QuestionAdmin(admin.ModelAdmin):
fieldsets = [
(None, {'fields':['question_text']},
'Date information',{'fields':['pub_date'],'classes':['collapse']}),
]
inlines = [ChoiceInine]
admin.site.register(Question,QuestionAdmin)
將Choice改為單行輸入:
class ChoiceInine(admin.TabularInline):
讓物件顯示欄位
預設地,Django顯示每個物件的str()返回的內容。但有時如果我們能顯示個別的欄位將很有幫助。我們使用list_display 選項來實現這個功能,它是一個要顯示的欄位名稱的元組:
class Question(models.Model):
list_display=('question_text','pub_date')
顯示中文
修改模型如下:
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import models
# Create your models here.
class Question(models.Model):
question_text = models.CharField(verbose_name="問題",max_length=200)
pub_date = models.DateTimeField(verbose_name="釋出日期")
def __str__(self):
return self.question_text
class Meta:
verbose_name = ('問題')
verbose_name_plural=verbose_name
class Choice(models.Model):
question = models.ForeignKey(Question)
choice_text = models.CharField(verbose_name='選項',max_length=200)
vote = models.IntegerField(verbose_name='投票數',default=0)
def __str__(self):
return self.choice_text
def Meta:
verbose_name = ('選項')
verbose_name_plural=verbose_name
自定義管理後臺的外觀
自定義管理後臺步驟如下:
1.建立一個templates檔案,在myblog目錄下面(包含manage.py的目錄)。
2.讓系統識別該模板目錄,開啟settings.py,找到TEMPLATES選項。
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [],
'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',
],
},
},
]
3.在templates下建立一個名為admin的資料夾,然後從Django安裝的原目錄下(目錄為django/contrib/admin/templates)將模板頁面的原始檔admin/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 %}