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 (бесплатная версия)

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