Добавить аргумент во все представления без необходимости редактировать их все, чтобы включить переменную в Django - PullRequest
0 голосов
/ 15 апреля 2020

Что мне нужно

Я разрабатываю систему уведомлений Pull для существующего Django проекта. С началом более 100 представлений я ищу способ включить аргумент (набор запросов уведомлений) во все представления, так как он отображается в моей базе. html, что я могу сделать, передав его в аргументы представления. словарь.

Проблема

Я хочу сделать это без редактирования всех представлений, так как это займет много времени и потребуется для всех будущих представлений, чтобы включить это переменная.

Что я пробовал

Создание фильтра шаблона и передача request.user в качестве переменной для возврата уведомления для этого пользователя. Это работает, однако, когда пользователь выбирает «Новое» уведомление, я хочу отправить сигнал обратно на сервер, чтобы перенаправить их на ссылку уведомления и изменить статус просматриваемого на «Истина» (POST или AJAX). Что потребовало бы, чтобы этот конкретный c вид знал, как обрабатывать этот конкретный запрос.

То, что я рассмотрел

• Редактирование самого основного «Представления» в Django.

Я изо всех сил пытался объяснить проблему, но если требуется дополнительная информация, не стесняйтесь спрашивать.

Спасибо!

модели .py

class NotificationModel(models.Model):

    NOTIFICATION_TYPES = {'Red flag':'Red flag'}
    NOTIFICATION_TYPES = dict([(key, key) for key, value in NOTIFICATION_TYPES.items()]).items()

    notification_type = models.CharField(max_length=50, choices=NOTIFICATION_TYPES, default='')
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    created = models.DateTimeField(blank=True, null=True)
    text = models.CharField(max_length=500, default='')
    viewed = models.BooleanField(default=False)

views.py Пример

class HomeView(TemplateView):
    template_name = 'app/template.html'

    def get(self, request, *args, **kwargs):
        notifications = NotificationsModel.objects.filter(user=request.user)
        args={'notifications':notifications}
        return render(request, self.template_name, args)

    def notification_handler(self, request)
        if 'notification_select' in request.POST:
            notification_id = request.POST['notification_id']
            notification = NotificationModel.objects.get(id=notification_id)
            notification.viewed = True
            notification.save()
            return redirect #some_url based on conditions

    def post(self, request, *args, **kwargs):
        notifications = self.notification_handler(request, *args, **kwargs)
        if notifications:
            return notifications

        return self.get(self, request)

Ответы [ 2 ]

1 голос
/ 15 апреля 2020

С началом более 100 представлений я ищу способ включить аргумент (набор запросов уведомлений) во все представления, так как это отображается в моей базе. html, что я могу сделать с помощью передавая его в словарь аргументов представления.

Вам не нужно помещать его в представления (а на самом деле не следует - представления не должны иметь дело с несвязанными обязанностями) - вы можно просто написать простой пользовательский тег шаблона , чтобы выбрать и отобразить все, что вам нужно в базовом шаблоне. Это правильное решение "django -esque" FWIW, так как оно оставляет ваши взгляды полностью отделенными от этой функции.

1 голос
/ 15 апреля 2020

Рассматривали ли вы mixins?

class NotificationMixin:
    my_var = 'whatever'
class MyDjangoView(NotificationMixin,.....,View)
    pass

Лучше, используя django встроенные функции ..

from django.views.generic import base

class NotificationMixin(base.ContextMixin):
    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['notification'] = 'whatever'    
        return context

и используйте этот миксин со всеми вашими взглядами КАК ПЕРВОГО КЛАССА Унаследованного , См. this .

Для вашего случая лучше вводить его вместо применения к базовому классу, класс базового представления не предназначен для изменения, он должен быть расширен, это почему мы можем решить эту проблему следующим образом ...

from django.generic.views import View as DjangoBaseView
from .mixins import NotificationMixin


class View(NotificationMixin, DjangoBaseView):
    pass

и использовать любую IDE для замены всех импортированных View s на View, а не django.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...