清洁功能没有运行

时间:2014-07-28 06:50:02

标签: python django admin formset

我最近一直在研究Django 1.6.0和Python 3.2.5,在管理界面设置过程中我遇到了一个问题。 基本上,我将编写一个应用程序(假设我要销售产品),客户可以选择一种语言。 目前,只有2种语言可用,但可能还有更多。

因此,我创建了一个名为Language的模型和另一个名为Settings的模型,其中一个字段是活动语言(M2M语言)。

我当然有一个名为Product的模型,其中包含有关产品的基本信息,以及一个名为SpecificProductInfo的模型,其中包含指向Product的pk,指向语言的pk以及给定语言的其他信息

现在,只要超级用户想要创建新产品,就会有一个包含每种语言的特定信息的表单集。对于与语言相对应的每个表单,当然不能修改该语言。我这样做了:

admin.py

class SpecificProductForm(forms.ModelForm):

    class Meta:
        model = SpecificProduct
        fields = ['language','name'] #language and name of the product in the given language

    def clean(self):
        cleaned_data  = super(SpecificProductForm, self).clean()
        c_language = Language.objects.get(name=cleaned_data.get('language'))
        cleaned_data['language'] = c_language

        return cleaned_data

class SpecificProductInfoFormSet(BaseInlineFormSet):
    form = SpecificProductInfoForm
    model = SpecificProductInfo

    def __init__(self, *args, **kwargs):
        super(SpecificProductInfoFormSet, self).__init__(*args, **kwargs)   

        choices = []
        final_choices = [] #the Language choiceField will only contain 1 choice, so that the user can't edit the box
        for lang in Settings.objects.get(pk=1).active_languages.all():
            choices.append((lang.pk, lang.name,))

        i = 0

        for form in self.forms:
            final_choices = []
            final_choices.append(choices[i])
            form.fields['language'] = forms.ChoiceField(choices=final_choices)
            i+=1

    def clean(self):
        for form in self.forms:
            form.cleaned_data  = form.clean()
            form.cleaned_data['language'] = Language.objects.get(name=cleaned_data.get('language'))


class SpecificProductInline(admin.StackedInline):
    model     = SpecificProduct
    formset    = SpecificProductFormSet

    settings = Settings.objects.get(pk=1).active_languages.all() 
    extra = len(site_settings)
    max_num = extra

    def has_delete_permission(self, request, obj=None):
        return False


class ProductAdmin(admin.ModelAdmin):
    list_display   = ...

    inlines = [SpecificProductInline,]

    def save_model(self, request, obj, form, change): 
        instance = form.save(commit=False)
        if not hasattr(instance,'node_creator'):
            instance.creator = request.user
        instance.modifier = request.user
        instance.save()
        form.save_m2m()
        return instance


admin.site.register(Product,ProductAdmin)

当我想添加产品时,我想要的所有内容都会显示在界面上。但每当我点击“保存”按钮时,我都会收到此错误“ValueError”,指出“语言”字段必须是语言模型而不是数字。 显然,没有调用clean函数。为了证明这一点,我在clean函数之后,在form和formset定义中添加了一个'raise Exception()'。但没有例外。你知道会发生什么吗? 非常感谢你

PS:首先,我没有使用一个formset而只是一个表单(我只有一种语言),它工作得很好(清理函数被调用)

0 个答案:

没有答案