我最近一直在研究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而只是一个表单(我只有一种语言),它工作得很好(清理函数被调用)