Общий вид обновления 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)})
Другие вопросы по тегам