Django学习7
在学习2中,介绍了关于admin的regist现在我们可以自定义admin的外观和表达的内容。
step1:定制admin form
在polls/admin.py中,我们使用了admin.site.register(Question)
这个方法让admin自己来生成关于Question的form,接下来我们修改这里的代码重新排列question_test和pub_date的位置来理解它是如何工作的,在polls/admin.py中将代码改为:
class QuestionAdmin(admin.ModelAdmin):
fields = ['pub_date', 'question_text']
admin.site.register(Question, QuestionAdmin)
这里的标准模式就是创建一个model的class,然后将他作为admin.site.register()的第二个参数。那么除此之外,还可以将file分组,利用如下代码就可以将pub_date归到一个名为Date information的组别之下:
class QuestionAdmin(admin.ModelAdmin):
fieldsets = [
(None, {'fields':['question_text']}),
('Date information', {'fields':['pub_date']})
]
step2:add相关的对象
question对应着许多的choice,我们可以使用最开始的register来加入Choice,但是这样就不能将Choice和question联系起来,所以我们可以将polls/admin.py改为如下的代码:
class ChoiceInline(admin.StackedInline):
model = Choice
extra = 3
class QuestionAdmin(admin.ModelAdmin):
fieldsets = [
(None, {'fields':['question_text']}),
('Date information', {'fields':['pub_date']})
]
inlines = [ChoiceInline]
admin.site.register(Question, QuestionAdmin)
这里就可以每次增添3个Choice(extra=3),当然在页面中可以看到一个“Add another Choice”的link,点击就可再多一个slot。但是可以发现Choice占用了一大块页面,我们可以将其class改成class ChoiceInline(admin.TabularInline):
就可以更加美观的来添加choice。
step3:定制你的List页面
当我们进入home>polls>Questions页面的时候,我们会发现其将所有的question的question_text显示在其中,但是有时候我们需要将其一些其他的信息显示出来,那么我们在QuestionAdmin中增加如下一行:
list_display = ('question_text', 'pub_date', 'was_published_recently')
这里可以发现“was_publiched_recently”方法也可以被作为一个字段,而且values就是这个function的output。
除此之外,这里的“question_text”和“pub_date”都是可以点击名称然后排序的,为了让"was_published_recently"也可以排序,我们在models的Question类中增加:
def was_published_recently(self):
return timezone.now() >= self.pub_date >= timezone.now()-datetime.timedelta(days=1)
was_published_recently.admin_order_field = 'pub_date'
was_published_recently.boolean = True
was_published_recently.short_description = 'Published recently?'
这样就给这个fuction赋予了一个别名为“publlished recently”,而且还能根据“pub_date”来排序,而且将用icon来替代False和True。
当有很多的question时就会发生找不到的情况,我们可以增加一个filter来选定我们需要的内容,在QuestionAdmin中加入:
list_filter = ['pub_date']
甚至有自带的search:
search_fields = ['question_text']
step4:调整外观
你会发现当进入admin页面的时候,标题写的是Django administration,这是非常扯淡的,所以对此我们要做出一点改变。
在最外层mysite目录下创建template目录,而后对mysite/settings.py进行修改,在templates下增加:
'DIRS': [os.path.join(BASE_DIR,'templates')],
创建一个名为admin的目录,之后将Django的source code中的admin/base_site.html赋值过来(django/contrib/admin/templates)。可以使用py -c "import django; print(django.__path__)"
来找到目录。
 而后改变其中的代码:
{% block branding %}
<h1 id="site-name"><a href="{% url 'admin:index' %}">Polls Administration</a></h1>
{% endblock %}