【问题标题】:Django generic UpdateView in DjangularDjangular 中的 Django 通用 UpdateView
【发布时间】:2015-07-17 19:34:12
【问题描述】:

Djangular Demos 的 Python 源代码提供了如何处理来自创建 Django 对象实例的表单的 post 请求的示例。但他们没有展示如何处理来自更新现有对象实例的表单的 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 时,这将是默认行为吗?

【问题讨论】:

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


    【解决方案1】:

    经过反复试验,我为视图的 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-06-25
      • 2018-12-30
      • 2021-11-17
      • 1970-01-01
      • 2017-08-03
      • 1970-01-01
      • 2015-10-17
      • 2017-06-23
      • 2020-02-27
      相关资源
      最近更新 更多