簡體   English   中英

如何將數據保存到views.py中的Django模型?

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

我正在嘗試創建一個電子商務站點(CS50 項目 2),該站點允許用戶將通過列表模型創建的列表添加到他們的監視列表中。 我正在使用帶有布爾字段的 Django 表單。 我需要幫助將列表保存到 WatchList 模型。 另外,由於多個用戶將有多個 WatchList,我是否應該實施 Sessions,如果是,我該怎么做?

視圖.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
    })

模型.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)

監視列表視圖.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
    })

固定視圖.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
    })

保存監視列表后,您需要在表單中執行類似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
    

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM