Лучшая практика django: включение определенного набора данных для каждой веб-страницы - PullRequest
1 голос
/ 24 декабря 2010

Я создаю простое веб-приложение, и мне нужно иметь правую боковую панель с личными данными пользователя. Это словарь из 20 строк и 10 модельных объектов. Я хочу, чтобы этот набор данных был включен в каждую веб-страницу. Есть два варианта.

(а) Я делаю что-то подобное для каждого действия:

data = {
     'somedata', somedata #data created for this action needed for the page
     }
    data.update(ul.getRightSidebarContent(user)) #add all data to be shown for the user
    variables = RequestContext(request, data) 
    return render_to_response("anypage.html", variables)

(b) создайте действия ajax и поместите их в шаблон base.html (который наследуется всеми страницами шаблона), чтобы при каждом запросе страницы действие ajax загружало содержимое правой боковой панели.

Есть ли другое решение для этого? Какой из них лучше? Возможные недостатки для каждого решения? Можете ли вы уточнить, пожалуйста?

Спасибо, Chris

Ответы [ 3 ]

5 голосов
/ 24 декабря 2010

Со стороны django есть два решения для этого:

  1. Вы можете использовать процессор контекста , который добавляет эти данные в ваш контекст перед рендерингом страницы. Я думаю, что это довольно хорошее решение для вашей проблемы, но имейте в виду, что контекстные процессоры вызываются, только если вы добавляете объект RequestContext во все ваши представления, если вы этого не делаете данные процессора не будут добавлены. Недостатком может быть то, что процессоры контекста будут вызываться с каждым из этих представлений, что может привести к небольшим накладным расходам, если они вам не нужны; но я не думаю, что это должно быть проблемой для вас ...

  2. Вы можете написать пользовательские теги шаблонов , которые извлекают эти данные в шаблон, используя их везде, где они вам нужны. Это может быть преимуществом, если теги шаблона уже отображают данные также в шаблоне, так что вам больше не придется иметь дело с этими шаблонами и просто поместите тег шаблона туда, где вы хотите, чтобы содержимое отображалось.

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

4 голосов
/ 24 декабря 2010

Я использую пользовательский тег шаблона, это очень удобно:

tags.py

from django import template
from my.models import model_name_or_*

register = template.Library()

@register.inclusion_tag('path/to/tag/template.html')
def my_tag():
    return { 'myData': MyModel.objects.all(), }

@register.inclusion_tag('path/to/tag2/template.html')
def my_tag2():
    return { 'myData2': MyModel.objects.all(), }

Шаблон тега - это то, что вы хотите, пример:

<ul>
{% for item in myData %}
<li>{{ item.name }}</li>
{% endfor %}
</ul>

И если вы хотите использовать эти теги в шаблоне, просто наберите: {% load tags %} где tag это ваш файл тегов и использование {% my_tag %}

2 голосов
/ 24 декабря 2010

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

http://docs.djangoproject.com/en/dev/ref/templates/api/#writing-your-own-context-processors

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