#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']