Я хочу создать страницу деталей с двумя моделями для сайта аукциона с помощью django, но продолжаю получать FieldError. Как исправить эту ошибку?

Я создаю сайт типа ebay, страница просмотра деталей должна отражать детали из двух моделей.

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

Проблема(ы), с которой я сталкиваюсь - как разместить две модели в моем представлении деталей, а также, если вы можете подтвердить мою текущую логику в поиске самой высокой ставки (если это правильно или нет).

MODELS.PY

class Auction(models.Model):
    ABSTRACT = 'AB'
    MODERN = 'MN'
    ILLUSTRATION = 'IN'

    select_category = [
        ('ABSTRACT', 'Abstract'),
        ('MODERN', 'Modern'),
        ('ILLUSTRATION', 'Illustration')
    ]

    title = models.CharField(max_length=25)
    description = models.TextField()
    current_bid = models.IntegerField(null=False, blank=False)
    image_url = models.URLField(verbose_name="URL", max_length=255, unique=True, null=True, blank=True)
    category = models.CharField(
        choices=select_category,
        max_length=12,
        default=MODERN,
        null=True, blank=True
    )
    created_at = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return self.title

    class Meta:
        ordering = ['-created_at']

class Bids(models.Model):
    auction = models.ForeignKey(Auction, on_delete=models.CASCADE, related_name='bidding')
    user = models.ForeignKey(User, on_delete=models.PROTECT, related_name='bidding')
    new_bid = models.DecimalField(max_digits=8, decimal_places=2)
    # new_bid = MoneyField(max_digits=10, decimal_places=2, null=False, blank=False, default_currency='USD', default=0)
    done_at = models.DateTimeField(auto_now_add=True)

    class Meta:
        ordering = ['auction', '-new_bid']

FORMS.PY

class AuctionForm(forms.ModelForm):
    
    class Meta:
        model = Auction
        fields = ['title', 'description', 'current_bid', 'image_url', 'category']

class BidForm(forms.ModelForm):

    class Meta:
        model = Bids
        fields = ['new_bid']
        labels = {
            'new_bid': ('Choose your maximum bid'),
        }

VIEWS.PY

def listing_detail(request, listing_id):
    detail = get_object_or_404(Auction, pk=listing_id)
    if detail == None:
        messages.add_message(request, messages.ERROR, "This is not available") 
        return HttpResponseRedirect(reverse("index"))
    bid_queryset = Bids.objects.filter(detail=listing_id).order_by('new_bid').first()
    if bid_queryset == None:
        bid = detail.current_bid
    else:
        bid = bid_queryset.new_bid
    context = {'detail': detail}
    return render(request, 'auctions/details.html', context)


@login_required
def make_bid(request, listing_id):
    bid_item = get_object_or_404(Bids, pk=listing_id)
    each_listing = Auction.objects.get(pk=listing_id)
    try:
        highest_bid = each_listing.bidding.order_by('-new_bid')[0]
    except Bids.DoesNotExist:
        highest_bid = 0
    if request.method == 'POST':
        form = BidForm(request.POST)
        if form.is_valid:
            if form['bidding'] > highest_bid:
                bidding = form.save()
                messages.add_message(request, messages.SUCCESS, "Your bid is currently the highest") 
                return HttpResponseRedirect(reverse("index"))
            else:
                messages.add_message(request, messages.ERROR, "Your bid must be higher than the previous bid") 

    else:
        form = BidForm(initial={'each_listing': each_listing,
                                    'user': request.user,
                                    'amount': highest_bid})
        return render(request, 'auctions/details.html', {'form': form})   

DETAILS.HTML

        <section>
            <div class="row container">
                <div class="col-sm-7 pr-5">
                    {% if detail.image_url %}
                        <img src='{{ detail.image_url }}' alt="{{ detail.title }}" style="width:100%">
                    {% else %}
                        <img src="https://demofree.sirv.com/nope-not-here.jpg">
                    {% endif %}  
               
                </div>
                <div class="col-sm-5">
                    <div style="width: 30rem;">
                        <div>
                            <h5>{{ detail.title }}</h5>
                            <hr>
                            <p>{{ detail.description }}</p>
                            <hr>
                            <p>{{ detail.current_bid }}</p>
                            <hr>
                            <p>{{ detail.new_bid }}</p>
                            <hr>
                            <button class="btn btn-primary btn-block" >Place bid</button>
                            <button class="btn-block btn-outline-primary">Add to watchlist</button>
                        </div>
                      </div>
                </div>

                <form action="{% url 'auctions:listing_detail' listing.id %}" method="post">
                    {% csrf_token %}
                    {{form.as_p}}
                    <input type="submit" value="Submit">
                </form>

Прямо сейчас у меня такое сообщение об ошибке

FieldError at /detail/15/
Cannot resolve keyword 'detail' into field. Choices are: auction, auction_id, done_at, id, new_bid, user, user_id
Traceback Switch to copy-and-paste view
C:\Users\USER\AppData\Local\Programs\Python\Python310\lib\site-packages\django\core\handlers\exception.py, line 47, in inner
                response = get_response(request) …
Local vars
C:\Users\USER\AppData\Local\Programs\Python\Python310\lib\site-packages\django\core\handlers\base.py, line 181, in _get_response
                response = wrapped_callback(request, *callback_args, **callback_kwargs) …
Local vars
C:\Users\USER\Downloads\commerce\commerce\auctions\views.py, line 95, in listing_detail
    bid_queryset = Bids.objects.filter(detail=listing_id).order_by('new_bid').first() 

Необходимо добавить либо поле pk, либо поле id в представлении listing_detail

Попробуйте это :

def listing_detail(request, listing_id):
    detail = get_object_or_404(Auction, pk=listing_id)
    if detail == None:
        messages.add_message(request, messages.ERROR, "This is not available") 
        return HttpResponseRedirect(reverse("index"))
    bid_queryset = Bids.objects.filter(pk=listing_id).order_by('new_bid').first() # change here
    if bid_queryset == None:
        bid = detail.current_bid
    else:
        bid = bid_queryset.new_bid

Примечание :

Измените этот {% url 'auctions:bid' listing.id %} на {% url 'bid' listing.id %} убедитесь, что listing.id находится в переменных шаблона.

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