【问题标题】:Django Custom middleware don't display message in each pageDjango Custom 中间件不在每个页面中显示消息
【发布时间】:2020-05-02 09:36:53
【问题描述】:

当用户访问我的页面时,我正在尝试使用每个页面中的会话打印添加喜欢的消息。 我提出了这段代码,它在 index.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

我的意见.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 %}

【问题讨论】:

    标签: django middleware


    【解决方案1】:

    您的代码中有许多可以改进的地方。让我们分部分进行:

    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。并且没有必要将其写入会话对象,因为您在每次请求后都会再次处理它。

    【讨论】:

      猜你喜欢
      • 2020-05-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-19
      相关资源
      最近更新 更多