Django Пользовательское промежуточное ПО не отображает сообщение на каждой странице - PullRequest
0 голосов
/ 02 мая 2020

Я пытаюсь напечатать сообщение «Мне нравится», используя сеанс на каждой странице, пока пользователь посещает мою страницу. И я вышел с этим кодом, он отображает мое маркетинговое сообщение в индексе. html.

middleware.py ---

from .models import MarketingMessage
from django.utils.deprecation import MiddlewareMixin

class DisplayMarketing(MiddlewareMixin):
    def __init__(self, get_response):
        self.get_response = get_response
    def process_request(self, request):
        print("something")
        try:
            request.session['marketing_message'] = MarketingMessage.objects.all()[0].message
        except:
            request.session['marketing_message']  = False

my views.py -

def index(request):
    products = Product.objects.all()
    marketing_message = MarketingMessage.objects.all()[0]
    context = {'products':products,'marketing_message':marketing_message}
    return render(request,'pro/index.html',context)

models.py -

from django.db import models


class MarketingMessage(models.Model):

    message = models.CharField(max_length=120)
    active = models.BooleanField(default=False)
    featured = models.BooleanField(default=False)
    timestamp = models.DateTimeField(auto_now=False,auto_now_add=True)
    updated = models.DateTimeField(auto_now_add=False,auto_now=True)
    start_date = models.DateTimeField(auto_now=False,auto_now_add=False,null=True,blank=True)
    end_date = models.DateTimeField(auto_now_add=False,auto_now=False,null=True,blank=True)


    def __str__(self):
        return str(self.message[:12])

base. html -

{% if marketing_message %}
      <div class="alert alert-success alert-dismissible alert-top-message" role="alert">
        <h3>
          {{ request.session.marketing_message|safe }}
        </h3>
        <button type="button" class="close" data-dismiss="alert" aria-label="Close">
          <span aria-hidden="true">&times;</span>
        </button>
      </div>
    {% endif %}

1 Ответ

0 голосов
/ 02 мая 2020

Есть много вещей, которые можно улучшить в вашем коде. Давайте go по частям:

1.

marketing_message = MarketingMessage.objects.all()[0]

Это повысит IndexError, если в вашей базе данных нет записей. Даже при том, что я нахожу странным, почему вы хотели бы сделать такой запрос, вы можете вместо этого сделать MarketingMessage.objects.first(), который вернет None, если записи не найдены.

2.

def index(request):
    products = Product.objects.all()
    marketing_message = MarketingMessage.objects.all()[0]
    context = {'products':products,'marketing_message':marketing_message}
    return render(request,'pro/index.html',context)

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

3.

def process_request(self, request):
        print("something")
        try:
            request.session['marketing_message'] = MarketingMessage.objects.all()[0].message
        except:
            request.session['marketing_message']  = False

process_request хук вызывается при каждом запросе , В вашем случае вы хотите, чтобы хук вызывался при обработке ответа. Для этой цели вы можете использовать process_template_response . И нет смысла записывать его в объект сеанса, поскольку вы обрабатываете его снова после каждого запроса.

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