Django Admin Inline默认生成多字段问题及解决方法
Django Admin内联显示多字段问题:原因及解决方案
问题描述
我有一个关联Ticket模型外键的TicketMessage模型,希望在Ticket的Admin面板中以Inline形式展示TicketMessage的message字段。实现后发现默认生成了三个message字段而非预期的一个,需要了解该问题产生的原因,以及如何设置为默认仅显示一个message字段。
TicketMessage模型代码
from django.db import models from django.utils.translation import gettext as _ from painless.models import TimeStampMixin class TicketMessage(TimeStampMixin): class Meta: verbose_name = _("Ticket Message"), verbose_name_plural = ("Ticket Messages") ticket = models.ForeignKey( "Ticket", default=False, on_delete=models.PROTECT, related_name="ticket_message", help_text="Lorem ipsum" ) message = models.TextField( _("message"), max_length=500, help_text="Lorem ipsum", ) def __str__(self): return f"Ticket subject: {self.ticket}" def __repr__(self): return f"Ticket subject: {self.ticket}"
Ticket Admin配置代码
from django.contrib import admin from django.utils.translation import gettext_lazy as _ from desk.models import ( Ticket, TicketMessage ) class TicketMessageInline(admin.TabularInline): model = TicketMessage @admin.register(Ticket) class TicketAdmin(admin.ModelAdmin): list_display = ( 'subject', 'status_choices', 'priority_choices', 'is_read', 'is_important', 'is_archive', ) list_filter = ( 'is_read', 'is_important', 'is_archive', 'status_choices', ) inlines = ( TicketMessageInline, ) filter_horizontal = ( "tags", ) fieldsets = ( (_("Primary Informations"), { 'fields': ( 'subject', 'message', 'status_choices', 'priority_choices', ) }), (_("Options"), { 'fields': ( 'is_important', 'is_archive', 'is_read', 'is_duplicated', ) }), (_("Others"), { 'fields': ( 'department', 'resolved_at', ) }), (_("Tags"), { 'fields': ( 'tags', ) }), )
问题原因
Django Admin的Inline类默认设置extra = 3,这个属性用于控制表单中额外显示的空白输入表单数量,因此默认会渲染3个空白的message输入字段。
解决方案
在TicketMessageInline类中添加extra = 1参数,即可将默认显示的空白message字段数量改为1个。修改后的完整Admin配置代码如下:
from django.contrib import admin from django.utils.translation import gettext_lazy as _ from desk.models import ( Ticket, TicketMessage ) class TicketMessageInline(admin.TabularInline): model = TicketMessage extra = 1 @admin.register(Ticket) class TicketAdmin(admin.ModelAdmin): list_display = ( 'subject', 'status_choices', 'priority_choices', 'is_read', 'is_important', 'is_archive', ) list_filter = ( 'is_read', 'is_important', 'is_archive', 'status_choices', ) inlines = ( TicketMessageInline, ) filter_horizontal = ( "tags", ) fieldsets = ( (_("Primary Informations"), { 'fields': ( 'subject', 'message', 'status_choices', 'priority_choices', ) }), (_("Options"), { 'fields': ( 'is_important', 'is_archive', 'is_read', 'is_duplicated', ) }), (_("Others"), { 'fields': ( 'department', 'resolved_at', ) }), (_("Tags"), { 'fields': ( 'tags', ) }), )
内容的提问来源于stack exchange,提问作者Thoughtless Thinker
相关产品推荐
相关产品推荐

