Джанго расширяет различные базовые шаблоны - PullRequest
1 голос
/ 26 февраля 2011

Я понимаю, что мы можем использовать "переменную extends" в шаблоне для переключения между двумя различными расширенными шаблонами. например,

  views:
     if something:
         base = 'base1.html'
     else:
         base = 'base2.html'
     return render_to_response ('template.html', {'base':base})

  template.html:
     {% extends base %}

Обычно это нормально работает. Однако моя проблема заключается в том, что я использую django-регистрацию, и мне не нужно писать свое собственное представление для обработки процесса регистрации и входа в систему. Это также означает, что я не могу передать переменную в шаблон. Хотя у меня есть шаблоны регистрации в каталоге моего проекта. (например, login.html)

К сожалению, Django не может сделать это в шаблоне:

   {% if something %}
     {% extends 'base1.html' %}
   {% else %}
     {% extends 'base2.html' %}
   {% endif %}

Единственный способ узнать, что «переменная база» может быть передана в auth-login, - это написать свои собственные представления, такие как login, logout и т. Д. Это похоже на то, что она не соответствует модели DRY и довольно подвержена ошибкам.

Есть ли другой способ, которым я могу это сделать? Или какие-нибудь указатели, чтобы обойти проблему?

Спасибо.

-P

Ответы [ 4 ]

4 голосов
/ 07 ноября 2012

Если это всего лишь 2 (или 3) варианта, в которых это «что-то» может быть преобразовано в логическое значение, тогда вы можете использовать фильтр yesno: https://docs.djangoproject.com/en/dev/ref/templates/builtins/#yesno

Итак:

{% extends something|yesno:"base1.html,base2.html" %}

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

{% extends selected_template|default:"base2.html" %}

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

4 голосов
/ 26 февраля 2011

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

В любом случае, если вы действительно хотите передать пользовательскую переменную в шаблон, отображаемый сторонним модулем, и не хотите взламывать этот модуль, то вам нужно использовать, например, например. пользовательский шаблонный контекстный процессор . Кроме того, django-регистрация позволяет передавать его просмотрам extra_context, возможно, этого будет достаточно. Вы также можете попробовать исправление обезьян. Или, может быть, вы можете попробовать манипулировать папками шаблонов или загрузчиками шаблонов, чтобы получить то, что вам нужно.

Но все это вещи IMHO, и вы не должны использовать разные шаблоны для одного представления, если это не общее представление.

1 голос
/ 26 февраля 2011

Я думаю, что вы не должны помещать различия между шаблонами в выбор различных базовых шаблонов.Наличие разных базовых шаблонов - это то, что нарушает принцип СУХОЙ.Поместите общие вещи в шаблон, т.е.registration.html, различия в других шаблонах, которые вы вызываете через 'include':

{%extends base.html%}

{%if something%}
    {%include "type1.html"%}
{%else%}
    {%include "type2.hmtl"%}  

, где имена шаблонов такие же, как вы использовали бы в определении представления.

1 голос
/ 26 февраля 2011

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

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