Коммерческий проект cs50w : IntegrityError UNIQUE constraint failed
Я работаю над проектом коммерции cs50w, пытаюсь создать новое объявление, но постоянно получаю эту ошибку:
IntegrityError at /new
UNIQUE constraint failed: auctions_listings.user_id
Вот мои модели для пользователя и листинга:
class User(AbstractUser):
pass
#def __str__(self):
#return f"{self.username}"
class Listings(models.Model):
title = models.CharField(max_length=30)
desc = models.TextField()
#starting_bid = models.FloatField(validators = [MinValueValidator(1)])
img = models.URLField(blank=True)
category = models.CharField(blank=True,max_length=20)
user = models.ForeignKey(User, on_delete=models.CASCADE, related_name="owner", primary_key=True)
Вот мой взгляд на новое объявление:
def new(request):
if request.method == "POST":
if not request.user.is_authenticated:
return render(request, "auctions/new_listing.html", {
"message": "Try logging in first"
})
user = request.user
######################################################
for u in User.objects.all():
print(f" UID = = {u.pk} | Name = = {u}")
######################################################
title = request.POST["title"]
img = request.POST["image"]
category = request.POST["category"]
#starting_bid = request.POST["starting_bid"]
description = request.POST["description"]
listing = Listings.objects.create(
user = user,
title = title,
img = img,
category = category,
#starting_bid = starting_bid,
desc = description
)
if listing is not None:
listing.save()
return redirect("index")
return render(request, "auctions/new_listing.html")
И форма для создания нового объявления:
<form action="{% url 'new' %}" method="post" class="form-horizontal" style="width: 50%; margin: auto;">
{% csrf_token %}
<div class="form-group">
<label for="title">Title: </label>
<input type="text" name="title" id="title" class="form-control" autofocus required>
</div>
<div class="form-group">
<label for="image">Image URL: </label>
<input type="url" name="image" class="form-control" id="image" autofocus>
</div>
<div class="form-group">
<label for="exampleFormControlSelect1">Category: </label>
<select class="form-control" id="exampleFormControlSelect1" name="category">
<option>clothing</option>
<option>electronics</option>
<option>collectables</option>
<option>appliances</option>
<option>furniture</option>
<option>other</option>
</select>
</div>
<!--
<div class="form-group">
<label for="starting_bid">Starting Bid: </label>
<input type="number" id="starting_bid" name="starting_bid" class="form-control" autofocus>
</div>
-->
<div class="form-group">
<label for="description">Description: </label>
<textarea class="form-control" id="description" name="description" rows="6" autofocus required>
</textarea>
</div>
<div class="form-group">
<input type="submit">
</div>
</form>
Я закомментировал начальную ставку везде, где она упоминалась, потому что у меня тоже были проблемы с этим, но сейчас меня это не очень волнует, сейчас я просто хочу иметь возможность создать листинг или два.
Я уже выполнил python manage.py makemigrations
и python manage.py migrate
.
Эта ошибка происходит с каждым из моих 4 пользователей, все с автоматически увеличивающимся идентификатором.
Я могу распечатать пользователей и их идентификаторы просто отлично.
Я также получаю это предупреждение:
auctions.Listings.user: (fields.W342) Setting unique=True on
a ForeignKey has the same effect as using a OneToOneField.
HINT: ForeignKey(unique=True) is usually better served by a OneToOneField.
Но я все еще получаю ту же ошибку при использовании поля "один к одному" или поля "много к одному". В конечном итоге я хотел бы, чтобы у каждого пользователя было много объявлений, но сейчас я просто пытаюсь добиться успешного создания хотя бы одного объявления.
Это не нужно:
if not request.user.is_authenticated:
return render(request, "auctions/new_listing.html", {
"message": "Try logging in first"
})
В этом также может быть проблема. Попробуйте следующее:
@login_required
РЕДАКТИРОВАТЬ: Я думаю, что проблема здесь. Вы установили в качестве первичного ключа внешний ключ. Вы должны стереть это "primary_key=True" и django создаст его сам.