10 - Django应用第七步

1 自定义管理表单

  通过在admin.py注册之后可以在后台中管理相应注册的表

  但是我们还学要更多的自定义操作

  polls/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)

  遵循的方法是

    - 编写一个模型管理类(model admin class)

    - 添加到admin.site.register() 中

  根据这样的更改, 发布日期出现在了问题题目的上面

  

  然而这样的修改还是不足够, 需要进一步定制

  polls/admin.py

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)

  此时修改完毕

  

2 添加相关对象

  刚才的问题还关联了它的选项, 但是在后台并没有展示

  方法一: 将Choice添加到后台管理

  polls/admin.py

from django.contrib import admin
from .models import Question, Choice

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

admin.site.register(Question, QuestionAdmin)
admin.site.register(Choice)

  此方法的问题是, 这样问题和选项就相互独立了, 这样他们之间的关联性体现就不强了, 操作也不方便

  虽然在Choice管理的时候可以通过下拉菜单的方式获得Question, 还可以点击加号添加

  方法二: 自定义Question在后台的显示

  polls/admin.py

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)

  可以看到

  

  可以看到, 多出来3个空白的选项, 这是

extra = 3

  产生的效果

  但是这样的选项占地面积太大, 能不能小一点呢

  polls/admin.py

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

  效果为

  

  注意多出来了一个delete?列

3 自定义修改列表  

   

  对于这样的列表显得有些信息量不足, 在这大片的列表信息中, 仅仅只显示了Question的标题

  让我们添加一些内容显示得更加丰满

  此时我们需要使用 list_display , 这是一个元组, 元组类就是列表显示的各列

class QuestionAdmin(admin.ModelAdmin):
    # 原有代码
    list_display = ('question_text', 'pub_date', 'was_published_recently')

  现在显示的结果为

  

  后台管理的功能十分强大, 点击标题可以进行排序

  但是我们自定义的方法不能被排序(不支持任意方法的输出结果排序)

  而且为了更加美观, 原有的方法名中间的下划线用空格替代了

  自定义方法的列的值是函数返回值的字符串表示形式

  为此我们做一点修改

  polls/models.py

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

  (然而似乎新增的三个属性已经不生效了 (;´д`)ゞ)

  另外还可以添加一个时间过滤器, 一个搜索框到QuestionAdmin

  polls/admin.py

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

  

4 自定义后台样式

4.1 自定义项目模板

  事实上, 模板文件可以存放在任何只要是Django项目可以访问到的地方, 但是按照管理, 也是为了规范和管理, 一般放到项目文件夹下

  在mysite/settings.py中添加DIRS

   mysite/settings.py

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加载模板的目录

  查询Django资源文件路径

python -c "import django; print(django.__path__)"

  本地的资源路径为

C:\Python36\Lib\site-packages\django

  并复制文件

C:\Python36\Lib\site-packages\django\contrib\admin\templates\admin\base_site.html

  在templates创建admin文件夹, 并将该文件复制到该文件夹中

  修改

  

  部分为本地的名字, 这就是后台的左上角展示的内容, 可以更改为

{% block branding %}
<h1 id="site-name"><a href="{% url 'admin:index' %}">Polls Administration</a></h1>
{% endblock %}

  结果为

  

  根据这个经验我们可以知道, 同样的方法, 只要覆盖admin的文件, 都可以进行自定义修改

4.2 自定义应用模板

  如果DIR设置为空, Django会查看APP_DIRS, 如果它设置为True, 那么此时Django就会在应用程序目录下查找templates目录

  现在我们的应用并不复杂, 但是如果后来应用越写越大, 那么此时管理该应用的后台模板的修改就是必要的了

  但是此时不应该修改项目的模板而是该应用的模板

  这样不仅更贱具有针对性, 也是的我们做好的应用能够移植的更好

  更多内容

5 定制后台首页

  默认情况下, 首页会根据INTALLED_APPS中的应用的字母顺序显示应用

  具体如果需要定制首页, 那么需要修改的首页为

C:\Python36\Lib\site-packages\django\contrib\admin\templates\admin\index.html

  其中的特殊变量app_list就是所有应用的列表

      

转载于:https://www.cnblogs.com/weihuchao/p/7085572.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值