【发布时间】:2010-12-08 20:07:38
【问题描述】:
我有一个 Django 应用程序,我试图在其中创建一个表单,该表单根据之前的下拉列表动态填充下拉列表。
简化模型:
class VehicleMake(models.Model):
make = models.CharField(max_length = 30)
class VehicleModel(models.Model):
model = models.CharField(max_length = 80)
make = models.ForeignKey(VehicleMake)
class Listing(models.Model):
make = models.ForeignKey(VehicleMake)
model = models.ForeignKey(VehicleModel)
表格:
class DynamicChoiceField(ModelChoiceField):
def clean(self, value):
return value
class MyForm(ModelForm):
category = ModelChoiceField(VehicleCategory.objects, widget=forms.Select(attrs={'onchange':'FilterMakes();'}))
make = DynamicChoiceField(VehicleMake.objects,widget=forms.Select(attrs={'disabled':'true','onchange':'FilterModels();'}), empty_label="Select Model")
model = DynamicChoiceField(VehicleModel.objects,widget=forms.Select(attrs={'disabled':'true'}), empty_label="Select Make")
class Meta:
model = Listing
查看:
def new_listing(request):
if request.method == 'POST':
form = MyForm(request.POST)
if form.is_valid():
form.save()
else:
form = MyForm()
return render_to_response("newlisting.html", {
"form": form,'model_id':model_id,'make_id':make_id
})
我还为自动填充定义了一些 ajax,但这不是问题
当我提交表单时,我得到以下信息:
Cannot assign "u'2'": "Listing.make" must be a "VehicleMake" instance.
如果我尝试
make=VehicleMake.objects.get(pk=request.POST['make'])
form.fields['make'] = make
然后我得到
'VehicleMake' object has no attribute 'widget'
【问题讨论】:
-
也许你的ajax 是的问题。也许你应该发布你的模板和 js。
-
虽然问题很可能出在 DynamicChoiceField - 您发布的缩减代码并没有真正显示它的作用。我希望人们会发布真实的代码。
-
Dustin - Ajax 部分在表单提交时起作用,它只从选择中获取值,而不是作为 VehicleMake 类的实例进行实例化
-
Daniel - 这是整个 DynamicChoiceField 类存在的唯一原因是覆盖 clean 函数而不是覆盖它,并且使用 ModelChoiceField 会导致验证错误
-
我应该注意到这段代码是基于达斯汀的例子nerdydork.com/… 主要区别在于我扩展 forms.Form 和 forms.ChoiceField 而不是扩展 forms.ModelForm 和 forms.ModelChoiceField