我正在嘗試通過 Django 創建一個電子商務網站(CS50 專案 2),并擁有一個具有多種形式的 Django 視圖。在這個視圖中,我試圖在 Django 表單中使用布爾欄位來使用戶能夠將串列添加到他的監視串列中,這兩個都是模型。在嘗試這樣做時,我收到了上述錯誤。
部分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():
watchlist = watchlist_form.save(commit=False)
watchlist.user = request.user
watchlist.add_to_watchlist = True
new_watchlist_listing = watchlist.objects.listings.add(listing)
return render(request, "auctions/listing.html",{
"auction_listing": listing,
"watchlistForm": watchlist_form
})
else:
return render(request, "auctions/listing.html",{
"auction_listing": listing,
"form": comment_form,
"comments": comment_obj,
"bidForm": bid_form,
"bids": bid_obj,
"watchlistForm": watchlist_form
})
return render(request, "auctions/listing.html",{
"auction_listing": listing,
"form": comment_form,
"comments": comment_obj,
"bidForm": bid_form,
"bids": bid_obj,
"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):
listings = models.ManyToManyField(Listings)
user = models.ForeignKey(User, on_delete=models.CASCADE, default="")
add_to_watchlist = models.BooleanField(default=False)
錯誤資訊
raise AttributeError("Manager isn't accessible via %s instances" % cls.__name__)
AttributeError: Manager isn't accessible via WatchList instances
由于這一行而發生此錯誤:new_watchlist_listing = watchlist.objects.listings.add(listing)。
uj5u.com熱心網友回復:
您添加帶有 的元素,因此沒有該部分。因此,您的視圖應如下所示:modelobject.manytomanyfield.add().objects
from django.contrib.auth.decorators import login_required
from django.shortcuts import get_object_or_404, redirect
@login_required
def listing(request, id):
listing = get_object_or_404(Listings.objects, pk=id)
watchlist_form = WatchListForm()
if request.method == "POST":
watchlist_form = WatchListForm(request.POST)
if watchlist_form.is_valid():
watchlist_form.instance.user = request.user
watchlist_form.instance.add_to_watchlist = True
watchlist = watchlist_form.save()
watchlist.listings.add(listing)
return redirect('name-of-the-view')
return render(request, 'auctions/listing.html',{
'auction_listing': listing,
'form': comment_form,
'comments': comment_obj,
'bidForm': bid_form,
'bids': bid_obj,
'watchlistForm': watchlist_form
})
注意:通常最好使用[Django-doc],然后直接使用[Django-doc]。如果物件不存在,例如因為用戶自己更改了 URL,將導致回傳HTTP 404 Not Found回應,而 using 將導致HTTP 500 Server Error。
get_object_or_404(…).get(…)get_object_or_404(…).get(…)
注意:如果 POST 請求成功,您應該制作一個[Django-doc] 來實作Post/Redirect/Get模式 [wiki]。這樣可以避免在用戶重繪 瀏覽器時發出相同的 POST 請求。
redirect
注意:您可以使用
@login_required裝飾器 [Django-doc]將視圖限制為經過身份驗證的用戶的視圖 。
注意:通常最好不要在使用方法 [Django-doc]
commit=False保存表單時使用:這將避免保存多對多關系,因為只有在提交專案時才能保存這些關系。通常最好更改表單中的包裹。有關更多資訊,請參閱我的文章[Django-antipatterns]。.save(…).instance
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/487019.html
