2017-08-20 180 views
0

在我的Django项目中,我有ProductsDjango:限制访问页面

您可以使用此URL模式访问产品:

example.com/tshirtexample.com/jacket

此外,还可以查看其他一些网页的那些产品,即:

example.com/tshirt/detailsexample.com/jacket/buy

我的问题: 当我在管理界面中创建新产品时,默认情况下会停用产品(我可以激活它后来)。原因是,当我创建一个新产品时,我通常没有所有必要的信息(即价格)。只要产品停用,所有以example.com/this-one-product开头的网址对普通访问者而言都不可见(404错误)。不幸的是,我不知道该怎么做。

我的目标是它对超级用户或员工的用户可见。因为他们可以检查该产品并查看其呈现时的外观,这是有道理的。但是,如前所述,网页的普通访问者不应该看到它。

现在我当然可以在所有这些视图中创建if语句(并检查超级用户或员工),但这听起来不像是一个优雅的解决方案。因为我必须将这些语句添加到许多不同的视图,这是违反DRY的,我只是不喜欢这个解决方案。

什么是完美的: 设置为停用的产品的所有访问者提供404错误。这怎么可能?

+0

你需要重写你的queryset与你的规则,为更多的帮助你需要显示你的详细信息视图。 –

+0

这似乎在文档中描述[https://docs.djangoproject.com/en/1.11/ref/contrib/admin/actions/](https://docs.djangoproject.com/en/1.11/ref/ contrib/admin/actions /) –

+1

[Django可能是\ _staff权限装饰器](https://stackoverflow.com/questions/5833184/django-is-staff-permission-decorator) –

回答

0

你定义两个函数返回的查询集可见的request.user的类型(人员/非工作人员)

我将其定义为一个QuerySet方法

def staff_visible(self): 
    queryset = self.filter(Q(staff_visible=True)) 
    return queryset 

def visible(self): 
    queryset = self.filter(is_active=True) 
    return queryset 

现在你可以使用和等等。

此外,您可以定义两个自定义管理器类,并覆盖get_queryset以使用上述两者之一。