简体   繁体   中英

How to save data to a Django model in views.py?

I am trying to create an e-commerce site (CS50 Project 2) that allows the user to add a listing, created through the Listings Model, to their WatchList. I am using a Django form with a Boolean field. I need help saving the listing to the WatchList Model. Also, since there will be more than one WatchList because of the multiple users, should I implement Sessions, and if so, how do I do that?

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 views.py

def watchlist(request):
    watchlist = WatchList.objects.filter(user=request.user)
    get_listings = watchlist.listings.all()
    listings = get_listings.objects.all()
    #listings = [listings.title for listings in watchlist.objects.all()]
    return render(request, "auctions/watchlist.html",{
        "listings": listings
    })

fixed views.py

def listing(request, id):
    #gets listing
    listing = Listings.objects.get(id=id)
    watchlist_form = WatchListForm()
    if request.method == "POST":
        watchlist_form = WatchListForm(request.POST)
        if watchlist_form.is_valid():
            new_watchlist_listing = watchlist.listings.add(listing)
            WatchList.add_to_watchlist = True
            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
    })

You need to do something like watchlist.listing.add(listing) in your form after the watchlist has been saved. Read the docs I linked earlier, there are many examples there.

I would change the name of the ManyToManyField to listings though because watchlist.listings.add(listing) is better solely from a naming standpoint. There could be many listings not just one. Even when you query for listings from a watchlist doing watchlist.listings.all() reads better than watchlist.listing.all() .

You should also check in your view whether it's a POST request before creating your bound form and determining if it's valid. If it's not a POST , you want to create your unbound form (form with no data associated with it yet). Right now your unbound form is being overridden by your bound form because it uses the same variable and is assigned right before it. Another reason to perform that POST check.

Overriding part:

watchlist_form = WatchListForm()
watchlist_form = WatchListForm(request.POST)

I won't write the whole code for you because you'll learn more by experimenting with it, but here's a general overview:

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
    

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM