Django Manytomanyfield в форме Ajax - PullRequest
       10

Django Manytomanyfield в форме Ajax

0 голосов
/ 10 декабря 2018

Я реализовал Ajax CRUD.У моей модели есть одно поле ManyToMany (категория).Если я выберу только один элемент для этого поля, все будет хорошо, но если выбрать несколько элементов, это показывает неверную ошибку.Скажите, пожалуйста, что мне делать.

model.py:

class BusienssCategory(models.Model):
   title = models.CharField(max_length=20, unique=True)
   slug = models.SlugField(unique=True)
   description = models.CharField(max_length=45)

   def __str__(self):
      return self.title

class BusienssProfile(models.Model):
   title = models.CharField(max_length=20)
   description = models.CharField(max_length=40)
   category = select2.fields.ManyToManyField(BusienssCategory)
   image = models.ImageField(upload_to=upload_image_path, null=True, 
   blank=True)

   def __str__(self):
      return self.title

form.py:

class BusinessForm(forms.ModelForm):

class Meta:
    model = BusienssProfile
    fields = ('title', 'category',  'shortDescription')

view.py:

def save_business_form(request, form, template_name):
  data = dict()
  form = BusinessForm(request.POST, request.FILES)
  if request.method == 'POST':
    if form.is_valid():
        form.save()
        data['form_is_valid'] = True
        businesses = BusienssProfile.objects.all()
        data['html_business_list'] = render_to_string('business/business_profile/partial_business_list.html', {
            'businesses': businesses
        })
    else:
        data['form_is_valid'] = False
        context = {'form': form}
        data['html_form'] = render_to_string(template_name, context, 
        request=request)
  return JsonResponse(data)

ajax.js:

 var saveForm = function() {

    var form = $(this);
    var data = new FormData($('form').get(0));
    var categories = $("#id_category").val();
    var featured = $('#id_featured').prop('checked');
    var active = $('#id_active').prop('checked');

    data.append("image", $("#id_image")[0].files[0]);
    data.append("title",$("#id_title").val());
    data.append("category", categories);
    data.append("description",$("#id_Description").val());

$.ajax({
  url: form.attr("action"),
  data: data,
  processData: false,
  contentType: false,
  type: form.attr("method"),
  dataType: 'json',
  success: function (data) {
    if (data.form_is_valid) {
            Command: toastr["success"]("The profile has been 
            deleted.", "Success");           
    }
    else {
      Command: toastr["error"]("Something has gone wrong!", "Failure")
    }
  },
error: function(XMLHttpRequest, textStatus, errorThrown, url) {
                alert("Status: " + textStatus);
                alert("Error: " + errorThrown);

            }
});
return false;
};

Я уже протестировал форму без Ajax, и она не выдает никакой ошибки.Я думаю, что в Multiselect возвращаемое значение что-то не так.

1 Ответ

0 голосов
/ 11 декабря 2018

Наконец, я решил проблему, используя и serializeArray, и FormData вместе.Я использовал Formdata для обработки поля изображения и serializeArray для сериализации manytomanyField (и других полей).Вот мой окончательный файл JS:

var saveForm = function() {

    var form = $(this);
    serialData = form.serializeArray();
    // We need to use FormData to upload image or file 
    var data = new FormData($('form').get(0));
    data.append("image", $("#id_image")[0].files[0]);
    var other_data = form.serializeArray();
        $.each(other_data,function(key,input){
        data.append(input.name,input.value);
    });

 $.ajax({
    url: form.attr("action"),
    data: data,
    type: form.attr("method"),
    dataType: 'json',
    cache: false,
    processData: false,
    contentType: false,
    success: function (data) {
    ...
    }
   return false;
   };
...