Код Django, чтобы открыть отдельную вкладку в представлении render_to_response

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

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

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

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

   render_to_response('useradd.html')

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, такие как вкладки начальной загрузки. В этом случае вы должны либо: отобразить все формы в одном и том же шаблоне (по умолчанию скрытые, переключаемые событиями по нажатию) или b. извлекать данные для форм асинхронно. Преимуществом этого решения является более непосредственное восприятие пользовательского интерфейса для пользователя, недостатком, безусловно, является более сложная.

Больше помощи

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

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

Другие вопросы по тегам