【问题标题】:Django Ajax field helpDjango Ajax 字段帮助
【发布时间】: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

标签: ajax django


【解决方案1】:

在一位评论者建议 DynamicChoiceField 类是罪魁祸首之后,我将其删除并使用完全相同的其他参数设置 ModelChoiceFields 的表单对象。该对象似乎也正确通过和验证。额外的课程基于我发现的一个旧教程而存在。看来作者在那里所做的工作适用于 forms.ChoiceField 但不是使用 ModelChoiceField 所必需的

感谢大家的帮助

【讨论】:

    猜你喜欢
    • 2015-09-28
    • 1970-01-01
    • 2014-08-12
    • 2018-11-22
    • 2011-11-21
    • 1970-01-01
    • 1970-01-01
    • 2011-01-11
    • 1970-01-01
    相关资源
    最近更新 更多