如何在每个 URL 端点的每个视图上提供数据

How to serve data on every view at every URL endpoint

我想在每个 URL 端点提供相同视图的原因是视图向经过身份验证的用户发送通知信息。
例如,这里是包含我希望在每个页面中提供的数据的视图:

class NotificationsView(View):
    def get(self, request, *args, **kwargs):
        profile = Profile.objects.get(user__username=self.request.user)
        notifs = profile.user.notifications.unread()
        return render(request, 'base.html', {'notifs': notifs})

我正在尝试将上下文变量发送到我的模板中以供 javascript 使用。 JS 文件与模板分开,所以我试图先在基本模板中声明全局 JS 变量,然后在 JS 文件中使用它们。

base.html:

  ...
  {% include "landing/notifications.html" %}
  <script src="{% static 'js/notify.js' %}" type="text/javascript"></script>
  {% register_notify_callbacks callbacks='fill_notification_list, fill_notification_badge' %}  

landing/notifications.html:

<script type="text/javascript">
    var myuser = '{{request.user}}';
    var notifications  = '{{notifs}}';
</script>  

notify.js:

...
return '<li><a href="/">' + myuser + notifications + '</a></li>';
        }).join('')
    }
}  

基于这段代码,您可以看到我是如何陷入困境的,我需要使用 CBV 向 landing/notifications.html 发送正确的通知,以便确保可以为 JS 文件动态呈现 javascript 变量。

我完全不知道 URL 应该如何连接。
就像这样:

url(
        regex=r'^notes$',
        view=views.NotificationsView.as_view(),
        name='home'
    ),  

将我限制到特定端点(“/notes”)。

你建议我如何解决这个问题?

您可以使用这样的用户网址:

url(r'/s*', test, name='test'),

看看official docsthis link

你想要的可以这样概括:在你的应用程序的每个页面中添加一个子模板(你的通知模板,从数据库中获取数据)。

看看这个问题:Django - two views, one page.

例如,您可以为您的视图创建一个 mixin,其中包括模板上下文中的通知,它可能看起来像:

myview.html

<div>
{% include "notifications.html" %}  
<!-- Handle data from my view-->  
</div>

notifications.html:

<ul>
{% for notification in notifications %}
    <li><a href=""><!-- Your notif data --></a></li>
{% endfor %}
</ul>

这看起来很适合上下文处理器!无论视图和路线如何,它们都会在整个项目中添加上下文变量。以下是一些可能有帮助的阅读材料和示例代码:

django context processor

https://docs.djangoproject.com/en/2.0/ref/templates/api/#django.template.RequestContext

https://docs.djangoproject.com/en/2.0/topics/templates/#configuration

myproject.context_processors.py

def notifications(request):
    try:
        profile = Profile.objects.get(user__username=self.request.user)
        return {'notifs': profile.user.notifications.unread()}
    except Profile.DoesNotExist:
        return {}

myproject.settings.py

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',  # default
        'DIRS': [],  # default
        'APP_DIRS': True,  # default
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',  # default
                'django.template.context_processors.request',  # default
                'django.contrib.auth.context_processors.auth',  # default
                'django.contrib.messages.context_processors.messages',  # default
                'myproject.context_processors.notifications'  # your context processor
            ]
        }
    }
]