2

Djangular Demos的 Python 源代码提供了如何处理来自创建 Django 对象实例的表单的发布请求的示例。但他们没有展示如何处理来自更新现有对象实例的表单的发布请求。

更新对象的代码似乎相当复杂:我的代码缺少一些重要的东西。使用我的代码,我总是收到表单验证错误:Object with this Name already exists.

我正在使用 Django 通用 UpdateView 类,并且我的模型有一个名为name的唯一字段。

我的代码:

from django.views.generic.edit import UpdateView

class MyForm(NgModelFormMixin, Bootstrap3FormMixin, NgModelForm):
    scope_prefix='form_data'
    form_name = 'my_form'
    class Meta:
        model = models.MyModel
        fields = ['name','person']

class MyModelUpdate(UpdateView):
    model = models.MyModel
    form_class = MyForm

    def post(self, request, **kwargs):
        if request.is_ajax():
            return self.ajax(request, **kwargs)
        return super(MyModelUpdate, self).post(request, **kwargs)

    # from the djangular combined_validation example
    def ajax(self, request, **kwargs):
        # tbd: need update-specific logic here: pass in instance
        # parameter (object) or set it from pk.  Base class post 
        # methods use self.get_object()
        form = self.form_class(data=json.loads(request.body))
        return JsonResponse({'errors': form.errors, 
                             'success_url': force_text(self.success_url)})

我需要什么代码让 Django 加载由pk参数标识的实例并将其附加到表单。当请求数据来自 POST 而不是 ajax 时,这将是默认行为吗?

4

1 回答 1

2

经过反复试验,我为视图的ajax方法提出了以下新实现。它通过了我的测试,但感觉很笨重。

def ajax(self, request, **kwargs):
    form = self.form_class(data=json.loads(request.body), 
                           instance=self.get_object())
    try:
        form.save()
    except:
        # error is in form.errors
        pass
    return JsonResponse({'errors': form.errors, 
                         'success_url': force_text(self.success_url)})
于 2015-07-17T21:05:52.593 回答