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

时间:2018-02-02 12:27:05

标签: django django-templates django-views django-notification

我想在每个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发送正确的通知,以确保javascript变量可以动态为JS文件呈现。

我对如何连接URL感到困惑 就像这样:

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

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

你怎么建议我绕过这个?

3 个答案:

答案 0 :(得分:1)

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

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
            ]
        }
    }
]

答案 1 :(得分:0)

您可以使用以下用户网址:

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

看看official docsthis link

答案 2 :(得分:0)

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

请看一下这个问题: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>