Django: Как перейти от сообщения об ошибке к коду?
В настоящее время я работаю над Django-кодом, в котором я размещаю в шаблоне ставку, которая перебивает текущую ставку.
view.py
def article(request, id):
if request.method == "POST":
new_bid = request.POST["new_bid"]
user_name = request.user
get_article = Listing.objects.get(pk=id)
try:
if int(new_bid) < get_article.current_price:
messages.error(request, "Your bid does't count. Bid is less than highest bid.")
return HttpResponseRedirect(reverse("article", args=(id, )))
elif get_article.price.bid is None:
messages.error(request, "Entry is not a number or is none")
return HttpResponseRedirect(reverse("article", args=(id, )))
except AttributeError:
messages.error(request, "Attribute Error")
return HttpResponseRedirect(reverse("article", args=(id, )))
if int(new_bid) > get_article.price.bid:
bid_placement = Bid(
bid = int(new_bid),
user_name = user_name)
bid_placement.save()
get_article.price = bid_placement
get_article.save()
return HttpResponseRedirect(reverse("article", args=(id, )))
else:
get_article = Listing.objects.get(pk=id)
listed = request.user in get_article.watchlist.all()
return render(request, "auctions/article.html", {
"get_article": get_article,
"listed": listed
})
model.py
class Bid(models.Model):
bid = models.FloatField(default=0)
user_name = models.ForeignKey(User, on_delete=models.CASCADE, blank=True, null=True, related_name="user_bid")
def __str__(self):
return f"{self.bid}"
class Listing(models.Model):
title = models.CharField(max_length=20)
description = models.CharField(max_length=500)
developer_id = models.ForeignKey(Games, on_delete=models.CASCADE, blank=True, null=True, related_name="developer_id")
current_price = models.IntegerField()
price = models.ForeignKey(Bid, on_delete=models.CASCADE, blank=True, null=True, related_name="price")
user_name = models.ForeignKey(User, on_delete=models.CASCADE, related_name="user")
photo = models.URLField()
watchlist = models.ManyToManyField(User, blank=True, null=True, related_name="user_watchlist")
def __str__(self):
return f"{self.title} {self.description} {self.developer_id} {self.current_price} {self.photo} {self.price}"
article.html
{% extends "auctions/layout.html" %}
{% block body %}
<h2>Article</h2>
<ul><a href="{% url 'index' %}"></a>
<img src="{{ get_article.photo }}" alt="picture">
<li>Game: {{ get_article.title }}<br>
Description: {{ get_article.description }}<br>
Developer: {{ get_article.developer_id }}<br>
Current Price: {{ get_article.price }}€<br>
</li>
</ul>
{% if user.is_authenticated %}
My Bid: {{ get_article.price }} €<br>
<form action="{% url 'article' id=get_article.id %}" method="post">
{% csrf_token %}
<label>Bid:</label>
<input type="number" name="new_bid" min="0" placeholder="Bid" required><br>
<input type="submit" value="Place Bid">
</form>
{% else %}
<p>Please LogIn in to place a bid</p>
{% endif %}
{% for message in messages %}
<p style="color:red" {% if message.tags %} class="{{ message.tags }}"{% endif %}>{{ message }}</p>
{% endfor %}
{% endblock %}
В настоящее время я работаю над кодом, в котором я размещаю ставку в шаблоне, которая перебивает текущую ставку. Проблема заключается в следующем:
Если цена уже введена в базу данных, то я могу перебить ее. Однако если я как пользователь еще не сделал ставку, то устанавливается значение "Нет". Моя первая ставка приводит к сообщению об ошибке (Attribute Error). Я предполагаю, что мне нужно что-то изменить в models.py или view.py. Но я только в процессе обучения. До этого момента все шло хорошо, но теперь я застрял. Кто-нибудь может мне помочь?
Переведено с помощью DeepL.com (бесплатная версия)