【问题标题】:Foreign key in Ajax POST request in DjangoDjango中Ajax POST请求中的外键
【发布时间】:2020-02-16 22:15:09
【问题描述】:

我的网络应用有一些问题。我需要在我的 Ajax 请求中指定用户。当我尝试添加新项目时出现错误:
TypeError: Field 'id' expected a number but got. 有什么解决方案吗? 这是我的代码:

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) {

【问题讨论】:

  • 不确定这是否能解决所有问题,但这一行:expence_object = model_to_dict(Task.objects.get(pk=user_membership)) 引发异常,因为它需要一个整数并且您正在传递一个模型实例。应该是:expence_object = model_to_dict(Task.objects.get(pk=user_membership.pk))
  • @revliscano 我更改了它,但出现错误:* raise self.model.DoesNotExist(main.models.Task.DoesNotExist: 任务匹配查询不存在。* 但是 对象已创建(没有外键)。
  • 哦,当然。我知道错误是什么。让我详细说明我的答案

标签: python django ajax django-views


【解决方案1】:

您收到这些错误是因为您在视图中没有正确处理事情。首先,在创建 Task 对象时,您在保存它时没有设置 usertask 值,因此设置了 null。

另一方面,当您尝试在Task.objects.get(pk=user_membership) 获取刚刚创建的对象时,您做错了,因为您将User 实例传递给参数pk。它应该是一个整数。

此外,据我所知,您在这里要完成的工作: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),然后执行您需要执行的所有其他操作。

【讨论】:

    猜你喜欢
    • 2011-07-04
    • 2015-07-02
    • 2018-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-15
    • 2018-01-28
    • 1970-01-01
    相关资源
    最近更新 更多