AberSheeran
Aber Sheeran

Django后台扩展(二)

起笔自
所属文集: Django-Admin
共计 2056 个字符
落笔于

外键搜索

Django自带的后台有个搜索功能,但是在搜索外键的时候,就不能成功。

Related Field has invalid lookup: icontains

原因是如果是search_fields = ('product',),作为外键,这里不能直接写productproduct是个对象,没法直接查询。要写product的一个具体字段,譬如search_fields = ('product__title',)。就是product这个对象的title属性。

自动完成

当某一个模型使用外键连接到另一个模型时,Django Admin 中将生成一个下拉框允许选择模型,但如果选项过多,则无法快速找到要的目标。

借助 ModelAdmin.autocomplete_fields 可以轻松的实现模糊搜素、自动完成。但需要被搜索的目标模型开启 search_fields 字段以允许搜索功能。以下是 Django 文档中给出的样例:

class QuestionAdmin(admin.ModelAdmin):
    search_fields = ['question_text']

class ChoiceAdmin(admin.ModelAdmin):
    autocomplete_fields = ['question']

填充字段

当模型的某个字段为空时,在后台也显示为空,这时候需要填充一些字符进去让它变得好看。short_description指定该字段显示在后台中的描述

list_display = ('show_body', 'create_time', 'author')

def show_body(self, obj):
    if obj.body != "":
        return obj.body
    return "---"
show_body.short_description = "内容"

或者直接用empty_value_display

list_display = ('body', 'create_time', 'author')

body.empty_value_display = "占位字符"

内联显示

当某一个模型,使用外键指向另一个模型,并且在Admin中我们不想单独显示这个模型,而是在另一个模型里显示它。那么可以使用inlines

class ImageInline(admin.TabularInline):
    model = Image


@admin.register(Message)
class MessageAdmin(admin.ModelAdmin):
    inlines = [ImageInline, ]

显示图片

StackOverFlow有关于此的讨论,但我觉得它的实现不够优雅,于是有如下的代码。

from django.utils.html import format_html


class Image(models.Model):
    file = models.ImageField(upload_to='upload/', verbose_name="路径")
    obj = models.ForeignKey(TargetObject, on_delete=models.CASCADE, verbose_name="所属模型")

    def __str__(self):
        html = f'<div style="\
                background-image: url(/{str(self.file)});\
                background-size: cover; \
                background-position: center center; \
                width: 300px; \
                height: 300px;"> \
                </div>'
        return format_html(html)

    class Meta:
        verbose_name = u"图片"
        verbose_name_plural = u"图片"
如果你觉得本文值得,不妨赏杯茶
Django后台扩展(一)
没有下一篇