Как отобразить значения контекста в общем списке и подробных видах - PullRequest
0 голосов
/ 20 сентября 2019

У меня есть базовый файл шаблона (shared.html), содержащий верхний и нижний колонтитулы, использующиеся на каждой странице.У меня есть некоторые динамические значения из базы данных в shared.html (например, номер телефона, адрес, логотипы), которые отлично отображаются на странице представления индекса, но не отображаются ни на одной из страниц общих представлений.

Пожалуйста, укажите, каксделать это, чтобы отобразить все динамические значения на каждой странице общего вида.

индексное представление:

def index(request):
    # Display all the Dynamic values form models
    num = TopBar.objects.get()
    addressISD = AddressIslamabad.objects.all()
    addressRWP = AddressRawalpindi.objects.all()
    alt = Logo.objects.all()
    YLP7Text = WhyLP7Text.objects.all()
    PMBG = BGimages.objects.all()
    lp7Features = LP7features.objects.all()
    locate = Locations.objects.all()
    events = Events.objects.all()
    memberLogo = LP7MembersLogo.objects.all()
    testi = LP7Testimonials.objects.all()
    promo = Promotions.objects.all()


    c = context = ({
    'topBarNumber': num,
    'addressISD': addressISD,
    'addressRWP': addressRWP,
    'altText': alt,
    'YLP7Text': YLP7Text,
    'BG': PMBG,
    'featuresLP7': lp7Features,
    'LC': locate,
    'evt': events,
    'memLogo': memberLogo,
    'testi': testi,
    'promo': promo

    })

    # Render the HTML template index.html
    return render(request, 'index.html', c )

универсальное представление:

# Display the detail and generic views
class EventListView(generic.ListView):
    model = Events


class EventDetailView(generic.DetailView):
    model = Events


class PromotionListView(generic.ListView):
    model = Promotions

class PromotionDetailView(generic.DetailView):
    model = Promotions

Ответы [ 3 ]

0 голосов
/ 20 сентября 2019

В GenericViews вы можете переопределить метод get_context_data, чтобы установить context, который вам нужен в ваших шаблонах.

Вы можете сделать что-то вроде этого:

class EventListView(generic.ListView):
    model = Events
    # We could explicitly tell the view which template 
    # to use by adding a template_name attribute to the view, 
    # but in the absence of an explicit template Django will infer one
    # from the object’s name
    # template_name = 'path/template.html'

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        # Update context with data needed
        context['foo'] = 'bar'
        context['foo_2'] = 'bar_2'
        return context

В вашем шаблоне вы сможете получить доступ к context как:

{% for object in object_list %}
    {{ object.foo }}
    {{ object.foo_2 }}
{% endfor %} 

Для DetailViews вы можете переопределить тот же метод get_context_data, но вам не понадобится цикл в шаблоне.

Подробнее об этом вы можете прочитать в документации , эти примеры довольно сложны.

0 голосов
/ 20 сентября 2019

Я думаю, что вы можете написать для этого custom context processor.Например:

def custom_context_processor(request):
    # Display all the Dynamic values form models
    num = TopBar.objects.get()
    addressISD = AddressIslamabad.objects.all()
    addressRWP = AddressRawalpindi.objects.all()
    alt = Logo.objects.all()
    YLP7Text = WhyLP7Text.objects.all()
    PMBG = BGimages.objects.all()
    lp7Features = LP7features.objects.all()
    locate = Locations.objects.all()
    events = Events.objects.all()
    memberLogo = LP7MembersLogo.objects.all()
    testi = LP7Testimonials.objects.all()
    promo = Promotions.objects.all()

    context = {
        'topBarNumber': num,
        'addressISD': addressISD,
        'addressRWP': addressRWP,
        'altText': alt,
        'YLP7Text': YLP7Text,
        'BG': PMBG,
        'featuresLP7': lp7Features,
        'LC': locate,
        'evt': events,
        'memLogo': memberLogo,
        'testi': testi,
        'promo': promo
    }
    return { 'common_content': context }

И затем добавьте его к CONTEXT_PROCESSORS следующим образом:

TEMPLATES = [
    {
        # ...
        'OPTIONS': {
            'context_processors': [
                'path.to.custom_context_processor',
                # rest of the context processors
            ],
        },
    },
]

И используйте этот процессор контекста в верхнем и нижнем колонтитулах, например:

{% for key, value in common_content.items %}
     {{ key }} {{ value }}
{% endfor %}

Наконец, так как он выполняет много запросов к БД, вы можете использовать template fragment caching для уменьшения обращений к БД.

0 голосов
/ 20 сентября 2019

В общем виде,

class PromotionDetailView(generic.DetailView):
    model = Promotions
    template_name = 'promotions/promotions.html' #<app_name>/<model>_<viewtype>.html
    context_object_name = 'Promotions'

в вашем promotions.html сделайте это

{% extends 'blog/base.html'%}
{% block content %}
    {% for promotion in Promotions%}
    <article class="media content-section">
        <img class="rounded-circle article-img" src="{{ promotion.logos.url }}">
        <div class="media-body">
            <div class="article-metadata">
                <a class="mr-2" href="{% url 'user-post' promotion.Addresses %}">{{ promotion.Name }}</a>
                <small class="text-muted">{{ promotion.Date_posted|date:"d F, Y" }}</small>
            </div>
            <p class="article-content">{{ promotion.Phone_Number}}</p>
        </div>
    </article>
    {% endfor %}
{% endblock content %}
...