4.Django入门:教程-管理站点

来源:互联网 发布:易企cms怎么换模板 编辑:程序博客网 时间:2024/06/04 17:56

创建一个Django自动生成的管理界面

1.创建管理员用户

python manage.py createsuperuser

2.启动开发服务器

python manage.py runserver

3.进入管理站点

http://127.0.0.1:8000/admin/

用管理员用户登录

4.让模型在管理站点中可编辑

编辑polls/admin.py文件

from django.contrib import adminfrom .models import Questionadmin.site.register(Question)

5.自定义管理表单

修改一个对象的管理选项的步骤:创建一个模型管理对象(class),然后把该对象(class名)作为第二个参数传入admin.site.register()

编辑polls/admin.py

from django.contrib import adminfrom .models import Questionclass QuestionAdmin(admin.ModelAdmin):    fields = ['pub_date', 'question_text']admin.site.register(Question, QuestionAdmin)

有许多字段的表单,把表单分割成字段集:

from django.contrib import adminfrom .models import Questionclass QuestionAdmin(admin.ModelAdmin):    fieldsets = [        (None,               {'fields': ['question_text']}),        ('Date information', {'fields': ['pub_date']}),    ]admin.site.register(Question, QuestionAdmin)

可以任意地为每个字段集指定HTML样式类:

from django.contrib import adminfrom .models import Questionclass QuestionAdmin(admin.ModelAdmin):    fieldsets = [        (None,               {'fields': ['question_text']}),        ('Date information', {'fields': ['pub_date'], 'classes': ['collapse']}),    ]admin.site.register(Question, QuestionAdmin)

6.添加关联对象

有两种方法添加关联对象

编辑polls/admin.py

(1)方法一

from django.contrib import adminfrom .models import Choice, Question# ...admin.site.register(Choice)

(2)方法二

from django.contrib import adminfrom .models import Choice, Questionclass ChoiceInline(admin.StackedInline):    model = Choice    extra = 3class QuestionAdmin(admin.ModelAdmin):    fieldsets = [        (None,               {'fields': ['question_text']}),        ('Date information', {'fields': ['pub_date'], 'classes': ['collapse']}),    ]    inlines = [ChoiceInline]admin.site.register(Question, QuestionAdmin)

Django提供了一种以表格的形式显示内嵌的相关联对象的方法, 你只需改变一下ChoiceInline 的声明

class ChoiceInline(admin.TabularInline):    #...

7.自定义管理界面中的变更列表

默认地,Django显示每个对象的str()返回的内容。
使用list_display 选项来实现这个功能,它是一个要显示的字段名称的元组,在对象的变更列表页面上作为列显示:

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

Django不支持按照随便一个方法的输出进行排序。另外, 头部默认是这个方法的名字(用空格取代下划线),并且这列的每一项内容都是用返回值的字符串形式表示。
通过给这个方法(在polls/models.py中)添加一些属性来改进

class Question(models.Model):    # ...    def was_published_recently(self):        return 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?'

使用list_filter来添加过滤器

list_filter = ['pub_date']

添加搜索功能

search_fields = ['question_text']

8.自定义管理站点的外观

(1)自定义项目的模板

  • 在你项目的文件夹内(包含 manage.py的目录)创建一个templates目录
  • 打开你的配置文件(记住是mysite/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',            ],        },    },]

DIRS 是加载Django模板时检查的一个文件系统目录列表;它是一个搜索路径。

  • 在templates下创建一个名为admin的文件夹,然后从Django安装的原目录下(目录为django/contrib/admin/templates)将模板页面的源文件admin/base_site.html拷贝到这个文件夹里
  • 然后,只需编辑该文件并替换{{ site_header|default:_(‘Django administration’) }} (包括花括号)为你认为合适的自己站点的名称。
{% block branding %}<h1 id="site-name"><a href="{% url 'admin:index' %}">Polls Administration</a></h1>{% endblock %}
  • 要覆盖一个模板文件,只需要做和覆盖base_site.html相同的操作就行 —— 将它从默认的目录拷贝到你自定义的目录中,然后修改它。

(2)自定义应用的模板

由于DIRS默认是空的,Django是怎么找到默认的管理站点模板的?答案是,由于APP_DIRS设置为True,Django会自动地在每个应用包下面查找一个templates/子目录,留作备用。

9.自定义管理站点的首页面

默认情况下,首页面显示所有位于INSTALLED_APPS中且已经使用管理站点应用注册过的应用,这些应用按照字母顺序进行显示。
需要自定义的模板文件是 admin/index.html。 (从默认的目录拷贝到自定义的目录中)。
编辑这个文件,你将看到它有一个叫做app_list的变量。这个变量包含安装的所有Django应用。 你可以选择不像默认模板中那样使用它,而是以你认为最好的方式硬编码链接到每个对象自己的管理页面。

0 0
原创粉丝点击