Вступление
Вкладки обычно представляют собой визуальный (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