Skip to content
MisakaTang's Blog
Go back

Django学习--Writing your first Django app(5)

Edit page

中间还有自动化测试和自定义CSS的部分被我先忽略了,最后一块是讲自定义admin后台的内容的.
代码同步在github上mysite-part5

开始

在一开始的时候,我们把Question引入了admin模块,如果我们需要对字段进行更改的话,可以在admin.py文件中自己来定义,比如字段的顺序:

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

这样就可以交换2个字段的位置了~


如果说表单的字段很多的话,可能就需要分块来处理了,这时候就可以这么写:

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

admin.site.register(Question, QuestionAdmin)

这样就把字段分成了空和Date information两个部分,显示的效果就是这样的:

把Choice添加进来!

如果我们需要在admin里面修改choice,当然需要把它添加进来,简单的方法,可以直接
admin.site.register(Choice)
这样就可以最简单的将其引入,但是我们要注意到一个问题,那就是choice和Question是有外键关联的,我们应该是对对应的Question来添加choice,虽然上述的代码也可以实现这一功能,但是不够直观,而且比较麻烦. 我们可以用下面的方法来实现:

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)

我们在这里添加了一个ChoiceInline的类,设置对应的modelChoice,extra属性表示在页面上显示几条信息,效果如下:

这样的效果已经达到了我们的预期,修改起来已经很简便了.
我们也可以更改一下显示的样式,比如:
class ChoiceInline(admin.TabularInline):
这样的:

改变Question为列表显示

只要在QuestionAdmin类中添加一行:

list_display = ('question_text', 'pub_date')

就可以显示成列表的样式了,当然我们也可以把里面的方法显示出来,比如:

list_display = ('question_text', 'pub_date', 'was_published_recently')

就可以让Question显示成如下的样子:

我们还可以用下面的代码让样式变得更好看,并且变得可以排序:

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?'

我们还可以添加一个list_filter属性来对日期进行筛选:
list_filter = ['pub_date']
效果如下:

我们还可以在里面增加一个搜索框:
search_fields = ['question_text']

自定义admin外观

我们需要在项目目录下创建一个template文件夹(和manage.py同级),然后修改settings.py文件的TEMPLATES属性的DIRS字段,修改之后如下:

TEMPLATES = [    
    {        
        'BACKEND': 'django.template.backends.django.DjangoTemplates',        
        'DIRS': [os.path.join(BASE_DIR, 'templates')],        
        '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',            
                ],        
            },    
        },
]

这样,django就可以识别并且读取到templates文件夹了,接着在templates文件夹里创建一个admin文件夹,把django/contrib/admin/templates目录下的admin/base_site.html文件拷贝到刚才新建的admin文件夹中.

查看Django文件的路径: python -c "import django; print(django.__path__)"

然后把base_site.html文件中的{'{ site_header|default:_('Django administration') }' }改成例如Polls Administration,就可以在admin后台看到页面上的管理后台名称已经变成了Polls Administration.
这是最简单的修改admin的样式的方法,我们还可以自己来增加更多的模板文件来替换各种样式.

总结

这一节的主要内容就是自定义admin的各种信息,对于admin模块的使用有一个初步的了解,在这一部分之后,我们已经有了初步使用Django的基础,用这点知识,搭建一个例如个人博客也已经不是问题了.~


Edit page
Share this post on:

Previous Post
LeetCode刷题--557. Reverse Words in a String III
Next Post
Django学习--Writing your first Django app(4)