字段 'id' 需要一个数字但得到了 'Free'

Field 'id' expected a number but got 'Free'

我正在尝试添加一个表单,以便用户可以 post 他们自己的文章,但是当我点击发布按钮时它显示 Field 'id' expected a number but got 'Free'. 。我没有将 package_category 字段添加到表单中,因为我在 models.py

中为其设置了默认值
package_category = models.ForeignKey(Package_Category, on_delete=models.DO_NOTHING, verbose_name="Package Category", null=True, default="Free")

当我现在将 package_category 字段添加到 forms.py fields = [...] 时,它现在显示此错误 Field 'id' expected a number but got 'Free'. 。我真的不知道发生了什么

Views.py

@login_required
def CreateElement(request):
    user = request.user
    categories = Category.objects.all()
    info = Announcements.objects.filter(active=True)
    if request.method == "POST":
        form = CreateElementForm(request.POST, request.FILES)
        if form.is_valid():
            form.instance.creator = request.user
            element = form.save(commit=False)  # ← no commit=False
            element.slug = slugify(element.title)
            # element.package_category == "Free"
            element.save()
            messages.success(request, f'Hi, Your Element have been sent for review and would be live soon!')
            return redirect('creators:dashboard')
    else:
        form = CreateElementForm()

    context = {
        'form': form,
        'info': info,
        'categories': categories
    }
    return render(request, 'newpost.html', context)

我怀疑Package_Category是一个整数主键的常规模型。因此,package_category ForeignKey 定义中的默认值应该是该键的有效值。 Django 文档 mentions that:“对于像 ForeignKey 这样映射到模型实例的字段,默认值应该是它们引用的字段的值(pk,除非设置 to_field)而不是模型实例。”

为外键添加默认值时,不能将其设置为“Free”或“EPS”之类的字符串。您必须将默认值指向您所指的实际对象。在您的示例中,您必须将其指向由 Package_Category class 创建的对象。下面的代码只是一个示例,因为我不知道您的 Package_category 是如何构建的:

def get_default_category():
    # get_or_create returns a tuple and we will only need the first value, which is the object
    return Package_Category.objects.get_or_create(name="Free")[0]

package_category = models.ForeignKey(Package_Category, on_delete=models.DO_NOTHING, verbose_name="Package Category", null=True, default=get_default_category)

请注意,它必须使用方法 get_or_create,因为如果模型是第一次 运行,您将无法使用该对象。确保自动创建它以防止错误。

错误跟踪告诉您您还必须更改 file_format 字段的默认值“EPS”。