Я использовал django -extra-views , чтобы создать модал, отображающий набор форм. С dynamici c -formset-views я добавил функциональность для динамического добавления и удаления форм из набора форм.
При открытии модального курса мы следуем принципу «многие к одному» и получаем всех сотрудников за определенную стойку. Для каждого экземпляра сотрудника мы создаем форму.
![enter image description here](https://i.stack.imgur.com/1AQ8m.png)
В настоящее время я пытаюсь отправить изменения существующему сотруднику и новым добавленным сотрудникам с помощью ajax в API вместо использования django представления, чтобы я мог отображать потенциальные ошибки, которые возвращаются с сервера, в модальном режиме без перезагрузки страницы.
Проблема:
- Как сериализовать данные набора форм? Подходит ли
$(form).serialize()
здесь или мне нужно создать объект JSON? - Как отличить guish от существующего сотрудника, которого изменил пользователь, и новых сотрудников, добавленных пользователем? Нужно ли сериализовать их отдельно и сделать ajax PATCH для первой и ajax PUT для второй группы? Или мне нужно настроить это поведение в API?
views.py
class DeskEditEmployeesView(AjaxTemplateMixin, ModelFormSetView):
model = db_models.DeskEmployeeMap
ajax_template_name = 'my_modal.html'
form_class = forms.DeskEmployeeMapForm
success_url = reverse_lazy('finance:tc_desk')
slug_field = 'desk'
factory_kwargs = {'extra': 0, 'can_delete': True}
api_url = 'api_desk_employee_map-list'
шаблон
[...]
<script language="JavaScript">
function formSuccess(form) {
location.reload();
}
function formError(data) {
$('#supplier_msg').html("The desk'" + data[0].value + "' already exists.");
}
$('#update_desk_employee').on('click', function () {
const form = $('#form');
const url = "{% url view.api_url %}";
const data = form.serialize();
const settings = {
url: url,
data: data,
dataType: 'json',
method: 'PUT',
headers: {
'content-type': 'application/json',
'Accept': "application/json; charset=utf-8",
'X-CSRFToken': "{{ csrf_token }}"
},
};
$.ajax(settings).done(
function (data) {
formSuccess(form)
}
).fail(function (response) {
formError(data)
})
})
[...]
API
class DeskEmployeeMapViewSet(viewsets.ModelViewSet):
queryset = db_models.DeskEmployeeMap.objects
serializer_class = serializers.DeskEmployeeMapSerializer
def put(self, request, *args, **kwargs):
return super().update(request, *args, **kwargs)
сериализатор
class DeskEmployeeMapSerializer(serializers.ModelSerializer):
class Meta:
model = db_models.DeskEmployeeMap
fields = '__all__'