Django 内联表单集创建空项目,但我不知道它们来自哪里

问题描述 投票:0回答:1

我几天来一直在努力让我的 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()
python django forms formset inline-formset
1个回答
0
投票

原因可能是您如何在 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()
© www.soinside.com 2019 - 2024. All rights reserved.