字段 '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”。
我正在尝试添加一个表单,以便用户可以 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”。