外键搜索
Django自带的后台有个搜索功能,但是在搜索外键的时候,就不能成功。
Related Field has invalid lookup: icontains
原因是如果是search_fields = ('product',)
,作为外键,这里不能直接写product
,product
是个对象,没法直接查询。要写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"图片"