Код Django для открытия отдельной вкладки в render_to_response в поле зрения

В моем коде Django я хочу реализовать следующий поток:

  1. После отправки HTML-формы для просмотра
  2. Перенаправление на следующую вкладку в той же HTML-форме, которая содержит следующую форму.

Это мой код до сих пор:

def addnewroute(request):
 if request.method == "POST":
       # do needed

   render_to_response('useradd.html')

person Abilash Raghu    schedule 13.01.2015    source источник
comment
Все, о чем я мог думать в этот момент, это следующее: создайте новый шаблон, назовите его useradd1.html (или как там) и установите активную вкладку на вторую вкладку.   -  person Maximilian Kindshofer    schedule 13.01.2015


Ответы (1)


Вступление

Вкладки обычно представляют собой визуальный (UI) элемент; это означает, что существуют стили CSS, определяющие фактические вкладки как "нажатые" или "нажатые". Способ «изменения» вкладок определяется выбранным вами методом реализации. Рассмотрим самые простые решения.

Ручной рендеринг (жесткий код / ​​мультишаблон)

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

def addnewroute(request):
    # ...
    if step1:
        return render_to_response('useradd-tab1.html')

    if step2:
        return render_to_response('useradd-tab2.html')

Повторное использование контекста/шаблона

Если вы предпочитаете повторно использовать большую часть содержимого вашего шаблона, вы можете использовать контекст аргумент словаря для передачи переменной step (чтобы определить, «на какой вкладке вы должны быть сейчас») и переменной content (содержащей содержимое вкладки или другие данные переключения) в ваш шаблон; который будет меняться в зависимости от достигнутого шага:

def addnewroute(request):
    # ...
    if step1:
        return render_to_response('useradd.html', {'step': 1, 'form': form1})

    if step2:
        return render_to_response('useradd.html', {'step': 2, 'form': form2})

Затем используйте переданные переменные контекста в своем шаблоне, чтобы определить условие, который переключает стиль selected на вкладках и отображает соответствующие форма.

<div id="tab1" class="tab{% if step1 %} selected{% endif %}">...</div>
{{ form.as_table }}

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

Предостережения относительно вышеприведенных реализаций прямого рендеринга

Вышеупомянутые методы могут выполнить то, о чем вы просили; однако есть несколько предостережений. Во-первых, URL-адрес остается прежним, что означает, что пользователь не может постоянно перемещаться между шагами. Во-вторых, объем «кода подключения», который вам придется написать (внешний и внутренний), будет настоящим трудом. Вот почему я бы рекомендовал одну из следующих реализаций для «ступенчатой ​​​​формы».

Мастер форм

Django (версии >= 1.4, ‹ 1.8) поставляется с "дополнительным приложением-мастером форм", которое разбивает формы на несколько веб-страниц". мастер форм Django использует специальный класс WizardView на основе представления для упрощения многоэтапного создания форм. Примечание. Начиная с Django 1.8 мастер форм был перемещен из django.contrib в это собственный пакет django-formtools.

Javascript

Более сложное решение может включать активируемые вкладки Javascript, такие как вкладки начальной загрузки. В этом случае вам придется либо: a. визуализировать все формы в одном и том же шаблоне (скрытые по умолчанию, переключаемые событиями по щелчку) или b. получать данные для форм асинхронно. Положительным моментом этого решения является более непосредственное ощущение пользовательского интерфейса для пользователя, а недостатком, безусловно, является большая сложность.

Дополнительная помощь

Если вы новичок в Django, шаблонах, вкладках и т. д., я бы посоветовал реализовать приведенные выше решения от первого до последнего, чтобы лучше понять, как работают внутренние компоненты; а затем, как вы можете высушить и упростить свой код.

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

person tutuDajuju    schedule 22.05.2015