2015-04-08 2 views
0

Я планирую использовать систему шаблонов Django несколько необычным способом. Мне нужно приложение, которое позволит мне легко создать простые формы «заполнить пробел», и я решил использовать шаблоны Django с пользовательскими тегами для создания форм.Использование шаблонов Django для создания форм

Вот набросок того, что я имею в виду:

<p> 
This is the <i>form</i>. Two plus two is {% gap four 4 vier %}.<br> 
The best programming language is {% case_gap Python Haskell %}. 
</p> 

{% if all_correct %} 
    You are smart. 
{% else %} 
    <input type="submit"> 
{% endif %} 

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

Вопрос заключается в том, как реализовать логику all_correct. Простое решение состоит в том, чтобы добавить эту переменную в контекст, а затем сделать каждый тег *gap обновить его на основе его правильного ответа, и, я считаю, это должно работать с моим примером. Но что, если я хочу переместить код {% if all_correct %} в начало шаблона, где ни один из gaps не был отображен, и, таким образом, никто из них еще не подтвердил свои ответы?

Похоже, мне нужно каким-то образом перебрать все теги *gap, прежде чем начинать визуализацию шаблона, и [попросить их] проверить ответы, но я не знаю внутренних систем шаблонов достаточно хорошо, чтобы реализовать это , Или может быть совершенно другой и лучший способ.

+0

Я думаю, вы пытаетесь сделать слишком много в шаблонах Django. Типичным подходом в Django было бы использовать [Django forms] (https://docs.djangoproject.com/en/1.8/topics/forms/#working-with-forms), чтобы выполнить проверку в представлении, а затем отобразить приводит к созданию шаблона. Возможно, вы сможете делать то, что хотите, погрузившись в внутренние элементы шаблона Django, но я бы не рекомендовал его. – Alasdair

+0

@Alasdair Ну, технически, вы правы. Но формы Django слишком сложны, чтобы создавать формы, в которых я нуждаюсь.В принципе, мне нужен хороший язык для описания простых форм, и я думал, что вместо того, чтобы изобретать и внедрять что-то новое, я мог бы взломать существующий. – kirelagin

+0

@kirelagin imo, это действительно не так сложно использовать для использования с формами Django. Все формы имеют префикс, чтобы избежать столкновения имен с полями, и если вы хотите использовать шаблон фабрики для построения списка форм, вы можете легко заполнить представление (и шаблон) с помощью как можно большего количества форм для опроса. Вы также можете проверить все формы в цикле. Если все верно, отобразите свое сообщение. – Brandon

ответ

0

Я считаю, что я понял, как это сделать после прочтения Chapter 9 книги Джанго.

Создание настраиваемого тега шаблона включает в себя определение двух вещей: как скомпилировать тег и как его отобразить. Функция компиляции должна анализировать данные тега и возвращать Node - как правило, вещь, которая имеет метод .render(self, context) и некоторые другие данные, полученные из текста тега.

Решение заключается в создании FormNode -а подкласса Node, который также будет иметь метод .validate(self, context). Затем наш пользовательский тег будет скомпилирован в подкласс FormNode, который реализует логику проверки.

Следующая вещь, которую нужно сделать, это создать FormTemplate -a подкласс Template с супер-силой: перед началом визуализации отдельных узлов он будет проверять все узлы итерируя над ними и вызывая validate(context) на всех подклассов FormNode и он будет устанавливать переменную all_valid в контексте.


Настоящая концепция внедрения: https://github.com/kirelagin/django-template-forms. Я считаю, что это работает очень хорошо.

Я использовал возможность создавать экземпляр пользовательского механизма шаблонов, который был добавлен в Django 1.8. В целом, мне пришлось копать немного глубже, чем можно было бы ожидать, и у меня всегда было такое чувство, что разделение API шаблонов и движок django (который теперь является только одним из доступных бэкэндов) еще не завершен. Я надеюсь, что Django 2.0 принесет нам новый классный материал, и все хаки, которые я должен был добавить, исчезнут.

Смежные вопросы