用于更新模型的Ajax和ModelForm

时间:2012-01-04 17:54:35

标签: django django-models django-forms django-class-based-views

我正在尝试使用Ajax / POST对模型进行更新。我希望能够发送更新的字段而不是表单中的所有字段。但这似乎导致表格无效。有没有办法做到这一点?

例如:

class Video(models.Model):
    name = models.CharField(max_length=100)
    type = models.CharField(max_length=100)
    owner =  models.ForeignKey(User, related_name='videos')
    ...
    #Related m2m fields
    ....

class VideoForm(modelForm):
    class Meta:
        model = Video
        fields = ('name', 'type', 'owner')

class VideoCreate(CreateView):
    template_name = 'video_form.html'
    form_class = VideoForm
    model = Video

更新名称时,我想发送带有此数据的POST

{'name': 'new name'} 

而不是

{'name': 'new name', 'type':'existing type', 'owner': 'current owner'}

同样用于更新类型。

有没有好办法呢?

2 个答案:

答案 0 :(得分:0)

我不清楚你为什么要这样做。我不确定仅发送更改字段的效率是否值得增加视图的复杂性。

但是,如果您真的想这样做,我会尝试覆盖get_form_class方法,并使用request.POST生成模型表单类来确定字段。

以下是未经测试的。

# in your question you are subclassing CreateView, but
# surely you want UpdateView if you are changing details.
class VideoCreate(UpdateView):
    template_name = 'video_form.html'
    model = Video

    get_form_class(self):
        """
        Only include posted fields in the form class
        """
        model_field_names = self.model._meta.get_all_field_names()
        # only include valid field names
        form_field_names = [k for k in request.POST if k in model_field_names]

        class VideoForm(modelForm):
           class Meta:
               model = Video
               fields = form_field_names

        return VideoForm

警告,这种方法会有一些怪癖,可能需要更多的黑客才能工作。如果您对此视图的一个字段执行了常规的非ajax POST,并且表单无效,我认为在呈现模板时所有其他字段都将消失。

答案 1 :(得分:0)

为什么不简单地创建一个表单 - 比如AjaxUpdateNameForm - 然后使用django-ajax-validation来处理ajax请求?