Django后台扩展(二)

最后更新时间: 2018-11-20 | 作者: AberSheeran | 捐助

外键搜索

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

1
Related Field has invalid lookup: icontains

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

填充字段

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

1
2
3
4
5
6
7
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

1
2
3
list_display = ('body', 'create_time', 'author')

body.empty_value_display = "占位字符"

内联显示

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

1
2
3
4
5
6
7
class ImageInline(admin.TabularInline):
    model = Image


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

显示图片

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

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
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
收录于#Django-Admin