django抽象类允许'set it and forget it!'模型的行为。

django-model-gatekeeper的Python项目详细描述


#gatekeeper是一个简单的django应用程序,它支持"设置并忘记它!"发布模型的行为。




将"gatekeeper"添加到已安装的应用程序设置中,如下所示:

````
已安装的应用程序=[

"gatekeeper",
]
`````

但你只想让一些文章在网站上"直播"。

现在;
*有些文章可能会被删除(稍后再发布)
*有些文章已经准备好发布,但您希望它们只在稍后的日期生效。

在这里,您需要做的只是将"gateKeeperAbstractModel"抽象类的子类,例如:

````
来自django.db import models
来自gateKeeper.models import gateKeeperAbstractModel

类文章(gateKeeperAbstractModel):
…(这里是您的自定义字段)
```

>超类创建两个字段:

1。` live_as_of`(datetime,default=none)-这是对象应该激活的时间戳。如果没有设置(无),可以将其视为"开发中"阶段。对于文章模型,您已经创建了实例,但仍在编写文章。你可以通过管理员预览它,但它不在网站上。`发布状态`(受控词汇,默认值=无)-这有4个可能的值:

*none=从未发布过-硬连接不向公众提供

您可以通过管理员设置"发布状态"和"实时"值。

以项目模型为例,这里是列表和详细视图的相应视图代码。

````
from django.views.generic import detail view,listview
from.models import article
from gatekeeper.mixins import gatekeeperlistmixin,gateKeeperDetailMixin

类articleListView(gateKeeperListMixin,ListView):
model=article
template\u name='article/article\u list.html'
context\u object\u name='articles'


class articleDetailView(gateKeeperDetailMixin,detailview):
model=article
template\u name='article/article\u detail.html'
context\u object\u name='article'
````


幕后发生的事情:

1。在ListView中,网关管理员使用以下规则筛选模型:

1。如果用户登录到管理和"发布状态"!=-1,包含模型实例。如果没有用户,且"发布状态"为1,则包括模型实例3。如果没有用户,`publish_status`=0,*和*current date/time>;`live_as_of`,则包括模型实例。
4。返回已筛选的模型实例列表。

2。在detailview中,gatekeeper遵循相同的规则,但是如果用户没有登录到admin并且请求对象还没有"活动",则会抛出404错误。

在最近的三篇文章中。如果您只是按照以下行创建一个QuerySet:

``most廑u recent廑articles=article.objects.order廑by(-date廑created)[:3]```


它将包含articles,而不管它们的网关情况如何。

将规则保存到您生成的任何查询集。

\应用规则并返回经过筛选的QuerySet。

```
来自GateKeeper.View实用程序导入视图GateKeeper

最近的文章=文章.objects.order_by('-date_created')
最近的文章=查看GateKeeper(最近的文章,is-auth)

```

is-auth参数允许您根据发出请求的用户是否登录进行筛选。如果它们已经登录,那么那些不存在但仍对管理员可用的对象将"通过"网关守卫。为此,您需要设置"is_auth=self.request.user.is_authenticated"。(我能看到的唯一一次是,如果你想看到一个特定的非实时对象如何在生成的内容功能中"播放"。

我发现我几乎不需要它。通常,对于构建的对象列表,您只想看到活动的内容,所以在几乎所有我使用过"view_gatekeeper"的情况下,我都设置了"is_auth=false"。当您登录到管理员时,您仍然可以通过其详细信息页"查看"所有非活动对象。

=对象网关守护者(我的文章是auth)

````

我需要它的一个例子是,当我有一个列表来自外部源时,其中一个模型中的对象有重叠。我想显示所有外部对象,并构造到重叠对象的链接,但前提是它们是活动的。

你可以用看门人来做这件事。

一个很好的例子就是主页应用程序。您可以将主页的不同格式副本排队,以便在不同时间上线。

模型和视图代码只有一个小小的更改:

```
来自django.db import model s
来自django.utils.translation import ugettext\u lazy as\uu
来自gatekeeper.models import gatekeeperseriaalabstractmodel

类主页(gatekeeperseriaalabstractmodel):
标题=models.charfield(
uu('title'),
max_length=200,
null=false



def get_absolute_url(self):
return reverse('homepage-detail',args=(self.pk))

def_uu str_uuu(self):
返回self.title

class meta:
verbose_u name='主页'
verbose_u name_u polarial='主页'

```

与以前一样,"gatekeeperserialabstractmodel"创建"live"和"publish"状态字段。它还创建一个"default_live"字段。

detailview):
model=homepage
template_name='homepage/homepage_detail.html'
context_object_name='homepage'
`````

在"urls.py"中设置"urls.py`

有一点小变化。您需要两个条目。

```
from django.urls import path
from.views import homepagedetailview

urlpattents=(
path(''',homepagedetailview.as_view(),name='homepage-live'),
path('homepage/<;int:pk>;/',homepagedetailview.as_view(),name='homepage-detail'),

````

如果您登录到管理员,您可以查看任何主页nstance(带有`/homepage/<;pk>;/`url)。
2.但是,对于"live"站点,我们发送的是不带"pk"的url。
3。'gatekeeperserialmixin` mixin-如果没有提供pk,将尝试查找模型的"最合适"实例。



*规则0:只有可以播放的对象才能播放(即"发布状态"不能为-1)

*规则1:如果您的日期是将来的,则不能播放` live_a s_of`is not none)

*规则3:禁止-选择"发布状态"为1的最新修改页(这是因为"始终打开"页可能从未经历过带有发布日期的发布步骤-它只是被迫on)

*规则4:禁止-选择最近修改的带有"发布状态"的页面!=-1的"default_live"=true。

*规则5:禁止-none(和404)。

注意规则4---这就是"default_live"字段的作用。您可以定义一个"default_live"为true的模型实例。如果没有其他实例通过规则,则返回此项。基本上,它可以是模型的通用"回退",以便公共页面总是返回一些内容。方便!

utils.py`-helper函数

is_queryset=false)
````


,其中object_set为:

1。具有子类"gateKeeperserialAbstractModel"的模型(并且"is_querySet=false"),或者;
2。来自具有子类"gateKeeperserialAbstractModel"的模型的查询(在这里发送"is_querySet=true")。

两个字段被添加到"list_display"(列表显示)中(它们将在modeladmin中的任何设置之后出现):

1。一个"show_publish_status",它将"live_as_of"和"publish_status"字段作为字段,并从中创建一个友好的字符串;
2。一个"available\u to\u public"模型属性,返回true/false以显示"这对公众可用吗"?

对于"串行"网守,还有两个字段:

1。`像以前一样显示"发布"状态。` is_live`-返回true/false以显示哪个项将显示在Live网站上。


\fieldsets


所有与GateKeeper相关的字段都显示在名为"GateKeeper"的字段集中的"模型管理"编辑页上。

管理员的列表页,定义了五个管理员操作:

1。""还原为预览/挂起状态":这将"live"设置为"of",将"publish"设置为"none"。该项不再有效,在更改这些值之前不会生效;
2。"使项目永久处于活动状态:设置"发布状态"为1---项目将处于活动状态;
3。"立即生效":这将"立即生效"设置为"立即生效",并且"发布状态"设置为0--项目将处于有效状态;
4。有条件地在线使用"live"作为"date"的"live":这将"publish"状态设置为0,并将"live"保持为"of"的状态。如果要更改永久有效或完全脱机的设置,可以使用此选项;
5。"使项目完全脱机:这将设置"发布状态"-1--项目完全从站点中消失。

以及"从模型中获取适当的对象"实用方法。运行"python runtests.py"。

_

他是管理员吗?如果是的话,您仍然可以"看到"不存在的页面。


把守大门。如果"父"模型A的网关设置会影响模型B,则可以根据模型A的设置将内容设置为覆盖模型B。例如,如果有作者和图书的模型,则可以设置为如果作者不在,则所有图书都不在。这对于您可能希望一次实时获取多个页面的站点来说很方便。


"独立"项

(将从pbsmm测试用例中添加)

,但有时您不希望父模型控制其子模型。独立模型不会检查其父级的权限。

例如,您可能希望限制为特定作者显示的图书,但此图书除外。因此,您可以为这本书设置"视为独立",并根据"live"和"publish"状态的"live"设置,设置是否为"live",而无需检查该书作者的相同值。






欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java如何拆分字符串(基于各种分隔符),但不保留空格?   解析。Json格式的txt文件和knime中的java   java Spring rest api为什么在rest api调用的响应中更改了数据类型   升华文本3抛出java。lang.ClassNotFoundException,而记事本++不存在   java Android指纹扫描仪在尝试5次后停止工作?   java Android如何设置精确的重复报警?   java如何使用HTTPGET connect为access API输入用户名和密码   java当测试报告显示没有测试失败时,Gradle为什么说“有失败的测试”?   用Gson实现java获取响应   MapReduce程序中函数错误的java不可映射参数   java spring安全性不符合自动代理的条件   java GWT使用异步回调进行同步/阻塞调用   java奇怪的类数组问题无法在jsp中显示   如何在java中使用PrinterJob使用epl打印条形码   java如何在JTable中居中单元格   将Java Mockito测试转换为Kotlin   html Java正则表达式模式匹配到多个相同标记   testCompile中缺少java Gradle(Android)多项目依赖项   在输入提示后输入字符串时发生java FileNotFoundException