繁体   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