Как предоставлять данные о каждом представлении на каждой конечной точке URL

Причина, по которой я хочу использовать одно и то же представление для каждой конечной точки 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' %}  

лендинг/уведомления.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").

Как бы вы предложили мне обойти это?


person Jay Jung    schedule 02.02.2018    source источник


Ответы (3)


Похоже, это хорошее применение для контекстных процессоров! Они добавляют переменные контекста во весь ваш проект, независимо от представления и маршрута. Вот немного чтения и пример кода, который может помочь:

контекстный процессор django

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

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

мой проект.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
            ]
        }
    }
]
person whp    schedule 03.02.2018

Вы можете использовать URL-адреса следующим образом:

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

Взгляните на официальные документы и эта ссылка

person Vladimir Yakovenko    schedule 02.02.2018
comment
Что означает это регулярное выражение? - person Jay Jung; 02.02.2018
comment
Я полагаю, это означает любую строку. - person Vladimir Yakovenko; 02.02.2018
comment
Это перенаправит каждую конечную точку URL только на это единственное представление. Возможно, мне следовало уточнить, что у меня есть другие представления, которые также используют другие конечные точки. - person Jay Jung; 02.02.2018

То, что вы хотите, можно резюмировать следующим образом: добавьте подшаблон (шаблон вашего уведомления с данными, полученными из базы данных) на каждой странице вашего приложения.

Взгляните на эту проблему: Django — два представления, одна страница.

Например, вы можете создать миксин для своих представлений, включающий уведомления в контексте вашего шаблона, который может выглядеть так:

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>
person Netizen29    schedule 02.02.2018