Как сохранить данные в модель Django в views.py?
Я пытаюсь создать сайт электронной коммерции (CS50 Project 2), который позволяет пользователю добавить объявление, созданное с помощью модели Listings Model, в свой WatchList. Я использую Django форму с булевым полем. Мне нужна помощь в сохранении объявления в модели WatchList. Также, поскольку будет более одного WatchList из-за нескольких пользователей, должен ли я реализовать Sessions, и если да, то как мне это сделать?
views.py
def listing(request, id):
#gets listing
listing = Listings.objects.get(id=id)
watchlist_form = WatchListForm()
watchlist_form = WatchListForm(request.POST)
if watchlist_form.is_valid():
watchlist = watchlist_form.save(commit=False)
watchlist.user = request.user
watchlist.save()
return render(request, "auctions/listing.html",{
"auction_listing": listing,
"watchlistForm": watchlist_form
})
else:
return render(request, "auctions/listing.html",{
"auction_listing": listing,
"watchlistForm": watchlist_form
})
return render(request, "auctions/listing.html",{
"auction_listing": listing
"watchlistForm": watchlist_form
})
models.py
class Listings(models.Model):
CATEGORY = [
("Miscellaneous", "Miscellaneous"),
("Movies and Television", "Movies and Television"),
("Sports", "Sports"),
("Arts and Crafts", "Arts and Crafts"),
("Clothing", "Clothing"),
("Books", "Books"),
]
title = models.CharField(max_length=64)
description = models.CharField(max_length=500)
bid = models.DecimalField(max_digits=1000000000000, decimal_places=2)
image = models.URLField(null=True, blank=True)
category = models.CharField(max_length=64, choices=CATEGORY, default=None)
user = models.ForeignKey(User, on_delete=models.CASCADE, default="")
class WatchList(models.Model):
listing = models.ManyToManyField(Listings)
user = models.ForeignKey(User, on_delete=models.CASCADE, default="")
add_to_watchlist = models.BooleanField(default=False)
Вам нужно сделать что-то вроде watchlist.listing.add(listing)
в вашей форме после сохранения списка часов. Прочитайте документацию, на которую я ссылался ранее, там есть много примеров.
Я бы изменил название поля ManyToManyField на listings
, потому что watchlist.listings.add(listing)
лучше только с точки зрения именования. Объявлений может быть много, а не одно. Даже когда вы запрашиваете объявления из списка наблюдения, watchlist.listings.all()
читается лучше, чем watchlist.listing.all()
.
Перед созданием связанной формы и определением ее валидности вам также следует проверить в своем представлении, является ли это запрос POST
. Если это не POST
, вы хотите создать свою несвязанную форму (форму без данных, связанных с ней). Сейчас ваша несвязанная форма переопределяется вашей связанной формой, потому что она использует ту же переменную и назначается прямо перед ней. Еще одна причина для выполнения этой проверки POST
Переопределяющая часть:
watchlist_form = WatchListForm()
watchlist_form = WatchListForm(request.POST)
Я не буду писать весь код для вас, потому что вы узнаете больше, экспериментируя с ним, но вот общий обзор:
if request.method == 'POST':
# Create bound form, check if form is valid, add the listing to the watchlist, and perform any other form processing logic
else:
# Create the unbound form so on a GET request, the unbound form is shown to the user