Как сохранить данные в модель 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
    
Вернуться на верх