3

我正在尝试使用 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'}

同样用于更新类型。

有没有好的方法来做到这一点?

4

2 回答 2

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,并且表单无效,我认为在呈现模板时所有其他字段都会消失。

于 2012-01-04T21:24:23.253 回答
0

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

于 2012-01-05T00:12:53.780 回答