#django #django-models #django-views #django-templates
#джанго #django-модели #django-просмотры #django-шаблоны
Вопрос:
Я получаю сообщение об ошибке: «Просмотр auctions.views.new_bid не вернул объект HttpResponse. Вместо этого он вернул None «.
Кто-нибудь знает, почему он возвращает None? Любая помощь приветствуется.
Это представление позволит пользователю делать ставки на товар на сайте, аналогичном ebay. new_bid позволяет им делать ставки, а listingpage — показывать фактическую страницу товара. Страница со списком загружается нормально, я просто получаю сообщение об ошибке, когда я помещаю число в форму заявки и сохраняю. В /admin
разделе сайта я вижу, что номер не сохраняется.
views.py:
def new_bid(request, listingid):
if request.method == 'POST':
auction_to_add = Listings.objects.get(id=listingid)
total_bid = request.POST.get("total_bid")
bid = Bid.objects.create(user=request.user, listingid=auction_to_add, bid=total_bid)
auction_to_add.bids.add(bid)
auction_to_add.last_bid = bid
auction_to_add.save()
return HttpResponse('success')
def listingpage(request, listingid):
comments = Comments.objects.filter(listingid=listingid)
item = Listings.objects.get(id=listingid)
return render(request, "auctions/listing.html", {
"listingid": listingid,
"comments": comments,
"product": item,
})
Часть html для страницы списка, которая позволяет пользователю размещать ставки:
<form id="addBid" data-startingbid="{{product.starting_bid}}" data-lastbid="
{{product.last_bid.bid}}" data-auction="{{product.id}}" action="{% url 'new_bid'
product.id %}">
{% csrf_token %}
<input type="number" name="totalBid" id="newBid" placeholder="Total bid">
<button class="button-auction" type="submit">Send</button>
</form>
urls.py
urlpatterns = [
path("listings/<int:listingid>", views.listingpage, name="listingpage"),
path("new_bid/<int:listingid>", views.new_bid, name="new_bid"),
]
models.py
class Bid(models.Model):
user = models.CharField(max_length=64)
title = models.CharField(max_length=64)
bid = models.IntegerField(blank=True, null=True)
listingid = models.ForeignKey('Listings', on_delete=models.CASCADE,
related_name='listing_for_bid')
class Listings(models.Model):
title = models.CharField(max_length=64)
description = models.TextField(max_length=250)
starting_bid = models.IntegerField()
bids = models.ManyToManyField('Bid', related_name='bids_in_the_auction', blank=True)
last_bid = models.ForeignKey('Bid', on_delete=models.CASCADE,
related_name='last_bid_for_the_auction', blank=True,
null=True)
Комментарии:
1. Вы сделали запрос GET, поскольку вы не указали
method="post"
в<form>
.
Ответ №1:
Ваша new_bid(request, listingid)
функция ничего не возвращает (поэтому возвращает None), когда метод запроса не POST .
Теперь вы не указали метод в своей форме, и поэтому по умолчанию используется GET . Следующее изменение должно это сделать:
<form id="addBid" data-startingbid="{{product.starting_bid}}" data-lastbid="
{{product.last_bid.bid}}" data-auction="{{product.id}}" action="{% url 'new_bid'
product.id %}" method="POST">
{% csrf_token %}
<input type="number" name="totalBid" id="newBid" placeholder="Total bid">
<button class="button-auction" type="submit">Send</button>
</form>
Комментарии:
1. Спасибо @dacx — я добавил ваше изменение, и это определенно помогло. Однако код в views.py по-прежнему не принимает номер, который я отправляю в качестве заявки. Он возвращает None, и я не знаю почему. Я не могу использовать отладчик в своей IDE, потому что он использует фреймворк Django — любой совет?