Как реализовать динамическую боковую панель с Django? - PullRequest
0 голосов
/ 14 января 2011

Я планирую создать боковую панель с изменяющимися элементами (в зависимости от текущего URL-адреса и статуса аутентификации).

Например: боковая панель по умолчанию показывает логин и облако тегов.

  • Если пользователь уже вошел в систему, я хочу отобразить меню пользователя.
  • Если текущий URL-адрес /tagcloud, я хочу скрыть его от боковой панели.

На самом деле мне нужен способ, который позволил бы мне сделать что-то подобное в виде:

def some_view(request):
    if request.user.is_authenticated():
        sidebar.remove('login')
        sidebar.add('user_menu')

def tag_cloud(request):
    sidebar.remove('tag_cloud')

После этого я хочу передать sidebar (неявно, без передачи его render_to_response) в шаблон, где я собираюсь сделать что-то вроде этого:

<div id="sidebar">
    {{ sidebar }}
</div>

Возможно ли это?

Ответы [ 3 ]

5 голосов
/ 14 января 2011

Вам лучше сделать это в файле context_processors.py
Это также означает, что вы должны использовать RequestContext при возврате ваших представлений

def include_tagcloud(request):
    if request.path == '/tagcould/':
        tagcloud = Tags.objects.filter(active=True) #whatever 
    return {'tagcloud': tagcloud}

def include_login(request):
    if request.user.is_authenticated():
        loginform = MyLoginForm(request.POST) 
        #passing a Django form + POST data in the case of re-submit
    return {'loginform' : loginform}

А потом в вашем шаблоне:

{% if loginform %}
      <form action="accounts/login/">
      {{form.as_p}}
      <input type="submit" name="Login">
      </form>
{% endif %}

{% if tagcloud %}
       {%for tag in tagcloud %}.....{%for}
{% endif %}

В этом примере форма входа указывает на фиксированный вид,
если вы хотите поймать сообщение формы входа в систему при каждом просмотре, я не знаю, как это сделать

РЕДАКТИРОВАТЬ: если вы не используете функции CSRF в Django, вы можете просто вставить форму входа в базовый шаблон, не используя форму django и указав на вид входа:

{% if user.is_authenticated %}
    <form action="accounts/login/">
    <input type="text" name="username"><input type="password" name="password">
    <input type="submit" name="Login">
    </form>
{% endif %}
0 голосов
/ 07 февраля 2019

Ответ @ Доминик правильный, но когда вы пишете что-то в context_processors, это загружается на любой странице веб-сайта. Это может быть причиной проблем с производительностью.

Я думаю, что правильный способ обработки динамической боковой панели - simpletag и используйте там, где вам нужно.

def get_sidebar():
    tags = Tags.objects.filter(active=True)
    latest_posts = Post.objects.all().order_by('-create_at')[:10]

    html = render_to_string("sidebar.html", {
        "tags": tags,
        "latest_posts": latest_posts
        })

    return html

А теперь просто используйте в файлах шаблонов:

<div class="col-md-4 sidebar">
    {% get_sidebar %}
</div>

Кроме того, вы можете передать request на simpletag, чтобы использовать user.is_authenticated для аутентифицированного доступа пользователя.

0 голосов
/ 16 января 2011

Да, но вы можете использовать как наследование шаблонов, так и композицию.Затем включите боковую панель в родительский шаблон, который используется / наследуется во всех ваших шаблонах.Тогда легко найти шаблон для боковой панели: он находится в отдельном файле.

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