мое marketing_message отображается только в индексе. html, а остальные страницы промежуточного программного обеспечения не отображают маркетинговые сообщения - PullRequest
0 голосов
/ 01 мая 2020

Я думаю, что так как я добавляю marketing_message в шаблоны views.py, поэтому мой контекст отображает сообщение только в index.py ... я хочу отображать мое сообщение на каждой странице моего приложения.

middleware.py

из .models import MarketingMessage из 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 %}

1 Ответ

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

Это означает, что вы должны либо передавать маркетинговое сообщение при каждом просмотре.

Или вы также можете создать собственный шаблон тега

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 функции

, все это описано в официальной документации

Редактировать: используя Middleware из документации по 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

тогда ваше промежуточное ПО должно скорректироваться контекст ответа после (или раньше, не уверенный, имеет ли это значение в вашем случае) представление называется

Также проверьте этот ответ возможно вы попытаетесь получить доступ к значению неправильным способом

...