我几天来一直在努力让我的 django admin 内联正常工作。它工作正常,但是当我在 django 管理 Web 界面上添加附加项目时,它确实保存了该项目,但添加了具有相同字段值(offer_select 值除外)的附加项目。后者始终是空的。为什么会发生这种情况?我做错了什么?
class OfferInlineForm(forms.ModelForm):
offer_select = forms.ModelChoiceField(queryset=Offer.objects.all(),
label='Offer_select')
def __init__(self, *args, **kwargs):
super(OfferInlineForm, self).__init__(*args, **kwargs)
instance = kwargs.get('instance', None)
if instance:
self.initial['offer_select'] = instance.id
class Meta:
model = Offer
fields = ('offer_select', 'partner', 'logotype', 'number', 'visible')
@admin.register(Feed)
class FeedAdmin(admin.ModelAdmin):
class OfferItemInline(admin.TabularInline):
model = Offer
form = OfferInlineForm
extra = 0
list_display = ('name', 'utm_source', 'number',)
ordering = ('name', 'number')
inlines = (OfferItemInline,)
fields = ('name',)
def save_formset(self, request, form, formset, change):
instances = formset.save(commit=False)
feed = form.instance
for instance in instances:
for data in formset.cleaned_data:
offer_select = data.get('offer_select')
offer_current = data.get('id')
partner = data.get('partner')
logotype = data.get('logotype')
visible = data.get('visible')
number = data.get('number')
if offer_select != offer_current:
instance.feed = None
instance.save()
offer_select.feed = feed
offer_select.partner = partner
offer_select.logotype = logotype
offer_select.number = number
offer_select.visible = visible
offer_select.save()
formset.save()
原因可能是您如何在 save_formset 方法中处理表单数据。您将 self.initial['offer_select'] 设置为 instance.id,但 Offer_select 应该是引用另一个 Offer 实例的 ModelChoiceField,而不是当前实例的 ID。 save_formset方法很复杂。您迭代实例中的每个实例,并迭代表单集。它可能会误用数据分配并无意中创建新记录。
class OfferInlineForm(forms.ModelForm):
offer_select = forms.ModelChoiceField(queryset=Offer.objects.all(), label='Offer_select')
class Meta:
model = Offer
fields = ('offer_select', 'partner', 'logotype', 'number', 'visible')
@admin.register(Feed)
class FeedAdmin(admin.ModelAdmin):
class OfferItemInline(admin.TabularInline):
model = Offer
form = OfferInlineForm
extra = 0
list_display = ('name', 'utm_source', 'number',)
ordering = ('name', 'number')
inlines = (OfferItemInline,)
fields = ('name',)
def save_formset(self, request, form, formset, change):
instances = formset.save(commit=False)
for form, instance in zip(formset.forms, instances):
if form.cleaned_data:
offer_select = form.cleaned_data.get('offer_select')
if offer_select:
instance.partner = form.cleaned_data.get('partner', instance.partner)
instance.logotype = form.cleaned_data.get('logotype', instance.logotype)
instance.number = form.cleaned_data.get('number', instance.number)
instance.visible = form.cleaned_data.get('visible', instance.visible)
instance.save()
formset.save_m2m()