无法通过 WatchList 实例访问管理器如何解决此错误?

滑板2020

我正在尝试通过 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 Errorget_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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何解决MySql“无法执行此命令”错误?

如何解决此错误VFY:无法解析虚拟方法

如何解决此错误“ JSON分析错误:无法从START_OBJECT中反序列化java.lang.Integer实例

如何解决MediaPlayer错误“无法播放此视频”

如何解决通过ID无法恢复实体的问题?

如何解决此“无法读取null的属性'appendChild'”错误?

Python如何通过上下文管理器强制对象实例化?

如何解决此Purescript错误:无法将{...}与(...)匹配?

无法通过此表单访问错误删除记录

我该如何解决此错误:无法识别的选择器发送到实例(LongPress onUIImageView)

通过ODBC管理器的DAO连接无法关闭

如何解决此错误“无法启用位置服务。错误:java.lang.NoClassDefFoundError”?

如何解决此问题,我的登录页面无法连接,并且继续出现此错误

如何解决Node.js中的此错误无法发布/Node.js中的错误

如何修复管理器无法通过Words实例错误访问?

BlackBerry-如何通过包含自定义管理器的VerticalFieldManager改进此搜索功能

无法访问启动管理器

SSRS错误无法访问报表管理器

无法通过文件资源管理器访问与系统级Powershell映射的驱动器

当Tomcat通过Apache Server运行时,无法访问Tomcat 8管理器

无法在解析服务器上创建一个类。正在获取错误代码1-服务器内部错误...如何解决此问题?

如何解决此错误:无法解决:com.android.support:appcompat-v7:26.1.0

无法通过集成测试中的连接管理器访问 App.Config

如何解决此“无法解析构造函数”错误?

如何解决此问题无法解决此符号?

我如何解决此错误无法在初始化程序中访问实例“小部件”

当我定义自定义管理器时 .. 错误:无法通过 Post 实例访问管理器

django:无法通过 username_and_password 实例访问管理器

通过cmd安装numpy时如何解决此错误?