我有一台包含published_date字段的Promotion型号.我想限制对future 促销的访问权限,只允许登录的用户预览他们的促销.

class Promotion(models.Model):
    title = models.CharField(max_length=100, blank=False, null=False)
    ...
    promotion_date = models.DateField(blank=False, null=True)

目前,我正在运行一个简单的基于类的DetailView:

class PromotionDetailView(generic.DetailView):
    model = Promotion
    context_object_name = 'book'
    template_name = 'PromoManager/book_detail.html'

但我不确定如何或何时拦截此请求,并在Promotion_Date大于今天的情况下为非登录用户添加重定向条件.我目前使用的是Simple_Tag,它返回一个 bootstrap alert ,突出显示future 的促销活动,但这纯粹是可视化的.

in_the_future = timezone.now().date()
if hasattr(book, 'promotion_date') and book.promotion_date > in_the_future:
    return ...appropriate message...

如果我是通过基于函数的视图来做这件事,我会用一个结合了重定向的if语句来实现它.我考虑过通过DetailView/TemplateView和GET_CONTEXT_DATA使用相同的方法,但感觉不太对劲.

如果Promotion_Date是future 的,我如何最好地拦截请求并为非登录用户重定向页面?

推荐答案

你只需在get_queryset分钟内过滤掉就行了:

from django.db.models import Q
from django.utils.timezone import now


class PromotionDetailView(generic.DetailView):
    model = Promotion
    context_object_name = 'book'
    template_name = 'PromoManager/book_detail.html'

    def get_queryset(self, *args, **kwargs):
        qs = super().get_queryset(*args, **kwargs)
        if not self.request.user.is_authenticated:
            qs = qs.filter(Q(promotion_date=None) | Q(promotion_date__lte=now()))
        return qs

因此,这将把查询集限制为将来不存在的项目,以防用户登录.过滤也在数据库端进行.

您可以通过覆盖dispatch来处理404,从而在这种情况下执行重定向:

from django.db.models import Q
from django.http import Http404
from django.shortcuts import redirect
from django.utils.timezone import now


class PromotionDetailView(generic.DetailView):
    model = Promotion
    context_object_name = 'book'
    template_name = 'PromoManager/book_detail.html'

    def get_queryset(self, *args, **kwargs):
        qs = super().get_queryset(*args, **kwargs)
        if not self.request.user.is_authenticated:
            qs = qs.filter(Q(promotion_date=None) | Q(promotion_date__lte=now()))
        return qs

    def dispatch(self, *args, **kwargs):
        try:
            return super().dispatch(*args, **kwargs)
        except Http404:
            return redirect('name-of-some-view')

Django相关问答推荐

如何在REST框架中以SON格式返回错误,而不是HTML格式返回错误?

Django-将html数据保存到quillfield中

Djnago admin中 Select 字段的自定义查询

获取PyCharm中继承方法的未解析属性引用

如何从列中捕获数据并将其添加到下拉菜单中,以便表单填充另一个表

Django-表单(ModelForm)中的数据不保存在现有数据库中

按下按钮刷新在html文件中显示的变量

为什么在 Docker 映像中运行我的 Django 应用程序后下载属性不再起作用?

Django 有脚手架吗?

如何获得用户权限?

如何在 django 模板中将名称反转为绝对 url?

我的 django 模型 DateField 如何将 30 天添加到提供的值?

django- nginx: [emerg] open() "/etc/nginx/proxy_params" 在 /etc/nginx/sites-enabled/myproject:11 中失败(2:没有这样的文件或目录)

如何使用 SQL 的IN等字段上的数组过滤 django 查询集?

ImportError:升级到 Django 4.0 后无法从 'django.conf.urls' 导入名称 'url'

在 docker 容器中创建 django 超级用户而不输入密码

django 在 unittest 测试中设置环境变量

Celery - 在一台服务器上运行不同的工作人员

如何仅在某些情况下禁用 Django 的 csrf 保护?

警告:找不到分发的 svn 位置==0.6.16dev-r0