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时,这将是默认行为吗?
答案 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)})