Поле 'id' ожидало число, но получило 'Free'

я пытаюсь добавить форму, чтобы пользователи могли размещать свои статьи, но когда я нажимаю на кнопку публикации, происходит ошибка 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'. . я не знаю, что происходит

models.py


class Elements(models.Model):
    title = models.CharField(max_length=10000, null=True, blank=True, verbose_name="Title")
    slug = models.SlugField(unique=True, max_length=1000)
    image = models.ImageField(upload_to="vectors-images/%Y/%m/%d/", default="default.jpg", verbose_name="Image Cover")
    vec_file = models.FileField(upload_to='vector-uploads/%Y/%m/%d/', null=True, blank=True, verbose_name="Upload File")
    category = models.ForeignKey(Category, on_delete=models.DO_NOTHING, verbose_name="Category", default="vector")
    package_category = models.ForeignKey(Package_Category, on_delete=models.DO_NOTHING, verbose_name="Package Category", null=True, default="Free")
    file_format = models.ForeignKey(Format, on_delete=models.SET_NULL, null=True, blank=True, default="EPS")

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 - это обычная модель с целочисленным первичным ключом. Поэтому значение по умолчанию в определении ForeignKey для package_category должно быть действительным значением этого ключа. В документации Django указано, что: "Для таких полей, как ForeignKey, которые связаны с экземплярами модели, значениями по умолчанию должны быть значения поля, на которое они ссылаются (pk, если не установлен to_field), а не экземпляры модели."

При добавлении значения по умолчанию для внешнего ключа вы не можете установить его на строку типа "Free" или "EPS". Вы должны указать значение по умолчанию на реальный объект, на который вы ссылаетесь. В вашем примере вы должны указать его на объект, созданный классом Package_Category. Код ниже - это просто пример, поскольку я не знаю, как устроена ваша категория 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, поскольку при первом запуске модели объект не будет доступен. Убедитесь, что он создается автоматически, чтобы избежать ошибок.

След ошибки говорит о том, что необходимо изменить значение по умолчанию с "EPS" и для поля file_format.

Вернуться на верх