Django Djang中的通用UpdateView

时间:2015-07-17 19:34:12

标签: angularjs django django-forms django-views djangular

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

更新对象的代码看起来相当复杂:我的代码缺少一些关键的东西。使用我的代码我总是得到表单验证错误: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时,这将是默认行为吗?

1 个答案:

答案 0 :(得分: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)})