外键搜索
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"图片"