在Django中,能否为无关联的两个模型建立StackedInline连接?
Django无关联模型实现StackedInline方案
首先先修正你代码里的拼写错误(这些错误会导致代码无法运行):
修正后的模型代码
class Item(models.Model): name = models.CharField(max_length=250) description = models.TextField() # 修正model→models的拼写错误 class Photo(models.Model): item = models.CharField(max_length=250) # 修正ChaField→CharField的拼写错误 title = models.CharField(max_length=250) # 修正ChaField→CharField的拼写错误
实现无关联Inline的Admin配置
Django默认的Inline依赖外键关联,要实现无关联模型的Inline,需要自定义Inline的查询和保存逻辑,代码如下:
from django.contrib import admin from .models import Item, Photo class PhotoInline(admin.StackedInline): model = Photo # 过滤出和当前编辑Item对应的Photo(通过name匹配) def get_queryset(self, request): queryset = super().get_queryset(request) if self.parent_obj: return queryset.filter(item=self.parent_obj.name) return queryset.none() # 保存Photo时自动关联当前Item的name def save_model(self, request, obj, form, change): obj.item = self.parent_obj.name super().save_model(request, obj, form, change) class ItemAdmin(admin.ModelAdmin): inlines = [PhotoInline] # 把当前编辑的Item对象传递给Inline,让Inline能获取到关联依据 def get_inline_instances(self, request, obj=None): inline_instances = super().get_inline_instances(request, obj) for inline in inline_instances: inline.parent_obj = obj return inline_instances admin.site.register(Item, ItemAdmin) # 修正原代码里的"strong text"错误 admin.site.register(Photo)
关键逻辑说明
get_queryset:根据当前编辑的Item的name,过滤出对应的Photo,确保编辑Item时只显示关联的照片。save_model:在保存Photo时,自动将当前Item的name赋值给Photo的item字段,维持两者的关联关系。get_inline_instances:把当前编辑的Item对象传递给Inline组件,让Inline能拿到关联的依据。
内容的提问来源于stack exchange,提问作者Noob
相关产品推荐
相关产品推荐

