【问题标题】:my marketing_message is displayed only in index.html and rest of the pages middleware dont display marketing messages我的 marketing_message 仅显示在 index.html 中,其余页面中间件不显示营销消息
【发布时间】:2020-08-15 23:47:03
【问题描述】:

我认为因为我在views.py 的模板中添加了marketing_message,这就是为什么我的上下文只在index.py 中显示消息... 我想在我的应用程序的每个页面中显示我的消息。

中间件.py

从 .models 导入 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

settings.py

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
    'marketing.middleware.DisplayMarketing',
]

在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)

base.html

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

index.html--

{% extends "pro/base.html" %}
{% load static %}
{% block head_title %}
Home||
{% endblock %}
{% block content %}
<div class="container">
  <div class="row">
    {% for product in products %}
    <div class="col-sm-6 col-md-4">
      <div class="thumbnail">
      {% if product.productimage_set.all %}
        {% for item in product.productimage_set.all %}
          {% if item.featured %}
          <div style="width:200px;
                      height:200px;
                      background-image:URL('{{ MEDIA_URL }}{{ item.image.url }}');
                      background-repeat:no-repeat;
                      background-size: cover;
                      background-position:center;
                      margin:0 auto;">

          </div>
          <!-- <img class="img-responsive" src="{{ MEDIA_URL }}{{ item.image.url }}" > -->
          {% endif %}
        {% endfor %}
      {% else %}
        <img src="{% static '/download.svg' %}" class="img-responsive" />
      {% endif %}
        <div class="caption">
          <a href="{{ product.get_absolute_url }}"><h3>{{ product.title }}</h3></a>
          <p>{{ product.description|truncatewords:15 }}</p>
          <p><a href="{{ product.get_absolute_url }}" class="btn btn-primary" role="button">View</a> <a href="#" class="btn btn-default" role="button">Button</a></p>
        </div>
      </div>
    </div>
    {% endfor %}
  </div>

</div>

{% endblock %}

【问题讨论】:

  • 在基本 html request.session.marketing_message.message 或 request.session.marketing_message
  • @giveJob 先生,我试过了,但消息仍然只出现在 index.html 中
  • 有问题的显示 index.html 可能是您没有从 base.html 正确继承模板
  • @giveJob 我添加了索引
  • 这个 MarketingMessage.objects.get() 是什么

标签: django middleware


【解决方案1】:

这意味着您要么必须在每个视图上传递营销信息。

或者你也可以create a custom templatetag

from django import template

register = template.Library()

@register.simple_tag
def marketing_message():
     return MarketingMessage.objects.all()[0]

然后在html中加载标签并显示结果。

编辑:

要在每个页面上都有消息,您可以在 base.html 中包含消息并从基础扩展其他模板 或者你必须在每个模板中导入和使用模板标签

编辑 2:base.html 中的用法

假设上述代码在poll_extra.py 中,并且您具有以下结构,其中polls 您的应用名称是

polls/
    __init__.py
    models.py
    templatetags/
        __init__.py
        poll_extras.py
    views.py

base.html需要:

{% load poll_extras %}
{% marketing_message %}

第一行加载标签,第二行是返回消息的标签,它被python函数的名称调用

这在official documentation中都有描述

编辑:使用中间件 来自documentation about middleware

class SimpleMiddleware:
def __init__(self, get_response):
    self.get_response = get_response
    # One-time configuration and initialization.

def __call__(self, request):
    # Code to be executed for each request before
    # the view (and later middleware) are called.

    response = self.get_response(request)

    # Code to be executed for each request/response after
    # the view is called.

    return response

那么你的中间件应该在调用视图之后(或之前,不确定它是否重要)调整响应的上下文

还请查看this answer,也许您尝试以错误的方式访问该值?

【讨论】:

  • 什么不起作用?它的行为是什么?你能描述更多吗?
  • 我希望我的 marketing_message 显示在每个页面上。但它只在索引页面上可见..
  • 您必须在每个页面上/或在您的base.html 中使用模板标签,并从基础扩展其他模板
  • 以及我需要作为模板标签包含在我的 base.html 中的内容??
  • 我调整了答案
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-31
  • 1970-01-01
相关资源
最近更新 更多