Пытаюсь добавить новую строку в таблицу sqlite с помощью Django. Получаю сообщение об ошибке целостности

#django #sqlite #django-models #error-handling #django-templates

#django #sqlite #django-модели #обработка ошибок #django-шаблоны

Вопрос:

Чешу в затылке, пытаясь понять, что я делаю не так. Я пытаюсь извлечь данные из поля ввода на моем веб-сайте и вставить их в таблицу sql. Когда я нажимаю кнопку отправки на своем веб-сайте, я продолжаю получать эту ошибку, НЕ удалось выполнить ограничение NOT NULL:auctions_bid.listing_id_id Что является причиной этого? любая помощь очень ценится. Спасибо, я прикрепил свой models.py , views.py и html-страницы ниже для дополнительного контекста.


Models.py

 class User(AbstractUser):
    pass

class Category(models.Model):
    category_id = models.AutoField(primary_key=True)
    category_name = models.CharField(max_length=100)

    def __str__(self):
        return f"{self.category_name}"

class Auction_listing(models.Model):
    listing = models.AutoField(primary_key=True)
    user_id = models.ForeignKey(User, on_delete=models.CASCADE, related_name="listings")
    start_price = models.IntegerField()
    product_name = models.CharField(max_length=50)
    prod_description = models.CharField(max_length=350)
    category = models.ForeignKey(Category, on_delete=models.CASCADE, related_name="bids")
    list_img = models.ImageField(null=True, blank=True)

    def __str__(self):
        return f"{self.user_id}: {self.product_name} ${self.start_price}"

class Bid(models.Model):
    bid = models.IntegerField()
    user_id = models.ForeignKey(User, on_delete=models.CASCADE, related_name="user_bids")
    listing_id = models.ForeignKey(Auction_listing, on_delete=models.CASCADE, related_name="all_bids")

class Comments(models.Model):
    comment = models.CharField(max_length=500)
    user_id = models.ForeignKey(User, on_delete=models.CASCADE, related_name="user_comments")
    listing_id = models.ForeignKey(Auction_listing, on_delete=models.CASCADE, related_name="all_comments")
  

views.py

 def listing(request, listing):
    #Find user id
    current_user = request.user
    new_bid = ''
    bid_count = Bid.objects.filter(listing_id=listing).count()
    #Gets the max bid for a particular listing in dictionary form
    max_bid = Bid.objects.filter(listing_id=listing).aggregate(Max('bid'))
    #Gets value of the bid__max key
    max = max_bid['bid__max']
    #Get all objects for particular listing
    page_listing = Auction_listing.objects.get(pk=listing)
    if request.method == "POST":
        bid = int(request.POST.get('Bid'))
        if bid > int(max):
            **new_bid = Bid(bid, current_user.id, listing)**
            **new_bid.save()**
            return HttpResponseRedirect(reverse("listing"))
            #return render(request, "auctions/listing.html", {
                #"page_listing": page_listing,
                #"Bid": bid_count,
                #"Max": max,
                #"Message": "Your bid has been reflected below"
            #})

        else:
            return render(request, "auctions/listing.html", {
                "page_listing": page_listing,
                "Bid": bid_count,
                "Max": max,
                "Message":'Value entered must be larger than current Bid'
        })

    else:
        return render(request, "auctions/listing.html", {
            "page_listing": page_listing,
            "Bid": bid_count,
            "Max": max,
            "User": current_user
    })
  

HTML шаблон

 {% extends "auctions/layout.html" %}

{% block body %}

<!DOCTYPE html>
<html lang="en" dir="ltr">
  <head>
    <meta charset="utf-8">
    <title></title>
  </head>
  <body>
    {{ number }}
    {{ Max }}
    {{ User }}
    <div class="">
      <h1>Listing:{{page_listing.product_name}}</h1>
    </div>
    <div class="">
      <img src="{{page_listing.list_img.url}}" alt="">
    </div>
    <div class="">
      <h3>{{ page_listing.prod_description }}</h3>
    </div>
    <div class="">
      <h3>{{ Bid }} bid(s) so far for this item</h3>
      {{ page_listing.start_price }}

    </div>
    <form class="" action="/listing/{{ page_listing.listing }}" method="post">
      {% csrf_token %}
      <div class="">
        <input type="text" name="Bid" value="Place bid">
      </div>
      <div class="">
        <input type="submit" name="submit" value="Place Bid">
      </div>
    </form>



  </body>
</html>
{% endblock %}
  

Комментарии:

1. Это означает, что вы не заполнили listing_id поле, хотя это необходимо.

2. Вы должны использовать аргументы ключевого слова для инициализации экземпляров модели Django — Bid(bid=bid, user_id=current_user.id, listing_id=listing)

3. Принято не включать «_id» в имя поля для ForeignKey , поскольку оно автоматически добавляется Django в качестве имени столбца базы данных и атрибута, содержащего исходное значение

4. Спасибо! Я смог заставить свой код работать, используя ваши предложения