我正在尝试通过 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
})
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):
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)
。
您添加带有 的元素,因此没有该部分。因此,您的视图应如下所示: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
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句