Общий вид обновления Django в Djangular
Исходный код Python для Djangular Demos дает примеры того, как обрабатывать запрос post из формы, которая создает экземпляр объекта Django. Но они не показывают, как обрабатывать запрос post из формы, которая обновляет существующий экземпляр объекта.
Код для обновления объекта кажется довольно сложным: в моем коде отсутствует что-то решающее. Используя мой код, я всегда получаю ошибку проверки формы: Object with this Name already exists.
Я использую универсальный класс UpdateView Django, и у моей модели есть уникальное поле с именем 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 ответ
После экспериментов методом проб и ошибок я придумал следующую новую реализацию метода представления 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)})