Внешний ключ в Ajax POST запросе в Django - PullRequest
0 голосов
/ 17 февраля 2020

У меня проблемы с веб-приложением. Мне нужно указать пользователя в моем запросе Ajax. Когда я пытаюсь добавить новый элемент, я получаю сообщение об ошибке:
TypeError: Поле 'id' ожидало число, но получило. Есть ли какие-либо решения? Вот мой код:

views.py

if request.method == 'POST':
    if request.is_ajax():
        form = AddTask(request.POST)
        if form.is_valid():
            form.cleaned_data
            form.save()         
            user_membership = User.objects.get(id=request.user.id)      
            expence_object = model_to_dict(Task.objects.get(pk=user_membership))
            return JsonResponse({'error': False, 'data': expence_object})

models.py

class Task(models.Model):
    title=models.CharField(max_length=200)
    date = models.DateTimeField(default=datetime.now,blank=True)
    is_published=models.BooleanField(default=True)
    usertask=models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.PROTECT,  null=True, blank=True)

Ajax форма

        $('#taskpost').submit(function (e) {
                // console.log("Creating the book");
                e.preventDefault();
                // get the form data
                var formData = {

                    'title': $('#id_title').val(),
                    csrfmiddlewaretoken: $('input[name=csrfmiddlewaretoken]').val(),
                    contentType: 'application/x-www-form-urlencoded',
                    encode: true,
                };
                $.ajax({
                    type: 'POST',
                    url: 'create/',
                    data: formData,
                    dataType: 'json',
                }).done(function (data) {

1 Ответ

1 голос
/ 17 февраля 2020

Вы получаете эти ошибки, потому что вы неправильно обрабатываете вещи в своих взглядах. Прежде всего, при создании объекта Task вы сохраняете его без установки значения usertask, поэтому устанавливается значение null.

С другой стороны, при попытке получить только что созданный объект здесь Task.objects.get(pk=user_membership) вы делаете это неправильно, потому что вы передаете экземпляр User параметру pk. Это должно быть целое число.

Кроме того, для того, что я вижу, вы пытаетесь достичь 1015 * здесь: expence_object = model_to_dict(Task.objects.get(pk=user_membership)) - получить только что созданную модель, но в вашем случае это совершенно не нужно. а также ты делаешь это неправильно. Пожалуйста, попробуйте следующий код:

form = AddTask(request.POST)
    if form.is_valid():
        # form.cleaned_data  <-- This line is unnecessary here too
        obj = form.save(commit=False) # Prevent saving before assigning usertask
        obj.usertask = request.user
        obj.save()
        expence_object = model_to_dict(obj)
        return JsonResponse({'error': False, 'data': expence_object})

Когда вы сохраняете форму, основанную на модели, она возвращает сохраненный экземпляр модели. Поэтому нет необходимости сохранять его в базе данных, а затем делать новый запрос, чтобы вернуть его. Просто назначьте его переменной (в данном случае obj) и выполните все остальные необходимые действия.

...