Поле «идентификатор» ожидало номер, но получило » ошибку при создании записи в таблице

#python #django

Вопрос:

Я работаю над сайтом аукциона в стиле ebay. Я создал свои модели, и у меня есть форма, которая создает новый список. Когда запрос на публикацию отправляется, список создается, когда я пытаюсь добавить список в заявку, я получаю сообщение об ошибке

Поле «идентификатор» ожидало номер, но получило »

Я довольно новичок в Django, поэтому, если вам понадобится что-нибудь, что я не включил, пожалуйста, дайте мне знать!

models.py

 class Listing(models.Model):
    title = models.CharField(max_length=200)
    description = models.CharField(max_length=500)
    url = models.URLField()
    author = models.ForeignKey('User', on_delete=models.CASCADE, name='author')
    category_id = models.ForeignKey('Category', on_delete=models.CASCADE, name='category', default="")

    def __str__(self):
        return f'{self.id}: {self.title}'

class Bid(models.Model):
    price = models.DecimalField(decimal_places=2, max_digits=10)
    bid_count = models.IntegerField()
    listing = models.ForeignKey('Listing', on_delete=models.CASCADE, name='listing', default="")

    def __str__(self):
        return f'{self.slug} ({self.price})'
 

views.py

 def newListing(request):
    try:
        if request.method == "POST":
            newListingForm = NewListingForm(request.POST)
            if newListingForm.is_valid():
                title = newListingForm.cleaned_data['title']
                description = newListingForm.cleaned_data['description']
                url = newListingForm.cleaned_data['url']
                bid = newListingForm.cleaned_data['bid']
                category_name = newListingForm.cleaned_data['category']
                category = Category.objects.get(title=category_name)
                category_id = category.id
                current_user = request.user
                l = Listing(title=title, description=description, url=url, author=current_user, category_id=category_id)
                l.save()
                print(l.id)
                b = Bid(price=bid, bid_count=0)
                b.listing.add(l.id)
                b.save()
                return HttpResponseRedirect(reverse("index"))
        else:
            newListingForm = NewListingForm()
            return render(request, "auctions/newListing.html", {
                'form': newListingForm
            })
    except Exception as exc:
        exc_type, exc_obj, exc_tb = sys.exc_info()
        fname = os.path.split(exc_tb.tb_frame.f_code.co_filename)[1]
        print(exc_type, exc_obj, fname, exc_tb.tb_lineno)
        newListingForm = NewListingForm()
        return render(request, 'auctions/newListing.html', {
            'form': newListingForm
        })
 

forms.py

 class NewListingForm(forms.Form):
    title = forms.CharField(max_length=200)
    description = forms.CharField(max_length=500)
    url = forms.URLField()
    bid = forms.DecimalField(decimal_places=2, max_digits=10)
    category = forms.ModelChoiceField(queryset=Category.objects.all())
 

Комментарии:

1. Не могли бы вы предоставить полную обратную связь?

2. Вы можете изменить свои отпечатки, чтобы помочь обнаружить пустые строки. print(l.id) Для print('id', repr(l.id)) .

Ответ №1:

Поскольку вы определили свое поле как поле выбора модели, список на самом деле является набором запросов, а не списком строк. Из документации:

Набор запросов объектов модели, из которого выводятся параметры для поля и который используется для проверки выбора пользователя. Он оценивается при отображении формы.

Отображается метка, представляющая объект, и вы могли бы изменить ее в своем классе формы, добавив label_from_instance(self, obj) метод.

Таким образом, эта строка category_name = newListingForm.cleaned_data['category'] вернет объект category , а не его имя.
Вместо этих 2 строк :

 category_name = newListingForm.cleaned_data['category']
category = Category.objects.get(title=category_name)
 

просто поставьте:

 category = newListingForm.cleaned_data['category']