#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. Спасибо! Я смог заставить свой код работать, используя ваши предложения