0

我希望在每个 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' %}  

登陆/notifications.html:

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

通知.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”)。

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

4

3 回答 3

1

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

django上下文处理器

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

我的项目.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
            ]
        }
    }
]
于 2018-02-03T00:39:10.427 回答
0

您可以像这样使用网址:

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

看看 官方文档这个链接

于 2018-02-02T13:34:43.997 回答
0

您想要的可以总结如下:在应用程序的每个页面中添加一个子模板(您的通知模板,数据从数据库中获取)。

看看这个问题:Django - 两个视图,一个页面

例如,您可以为您的视图创建一个 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>
于 2018-02-02T17:10:47.743 回答