Можно использовать {% include %}
с переменной.
def some_view_after_post(request):
# ... lookup value of myfield2 ...
return render(request, "path/to/after_post.html", {'myfield2: myfield2})
В шаблоне after_post.html
:
<!-- include a template based on user's choice -->
<div class="user-choice">
{% include myfield2 %}
</div>
Вы должны убедиться, что нет никакого способа, которым пользователь может ввести ошибочный выбор. Например, убедитесь, что значение myfield2 selection допустимо, прежде чем добавлять его в контекст.
Разделите 5.4 из эти , готовят Технический Отчет на Производительности C++ , полностью посвящен издержкам исключений.
Как предложение: не беспокойтесь слишком много издержками, когда исключения будут выданы. Реализации обработки исключений обычно делают не бросок быстро и ловлю медленными. Это в порядке, так как те случаи являются, ну, в общем, исключительными.
Carl
Вот имеющий размеры код, который я придумал. Вы видите какие-либо проблемы с ним?
Работы над Linux и Windows до сих пор, скомпилируйте с:
g++ exception_handling.cpp -o exception_handling [ -O2 ]
или например Экспресс Visual C++ .
Для получения основного случая ("поддержка исключения, удаленная из языка в целом"), используйте:
g++ exception_handling.cpp -o exception_handling [ -O2 ] -fno-exceptions -DNO_EXCEPTIONS
или подобные настройки в MSVC.
Некоторые предварительные результаты здесь . Они - вероятно, вся неаппетитная еда из-за переменной загрузки машины, но они действительно дают некоторое представление об относительной обработке исключений наверху. (Резюме: ни один или мало когда никакие исключения не выдаются, огромны, когда они на самом деле брошены.)
#include <stdio.h>
// Timer code
#if defined(__linux__)
#include <sys/time.h>
#include <time.h>
double time()
{
timeval tv;
gettimeofday(&tv, 0);
return 1.0 * tv.tv_sec + 0.000001 * tv.tv_usec;
}
#elif defined(_WIN32)
#include <windows.h>
double get_performance_frequency()
{
unsigned _int64 frequency;
QueryPerformanceFrequency((LARGE_INTEGER*) &frequency); // just assume it works
return double(frequency);
}
double performance_frequency = get_performance_frequency();
double time()
{
unsigned _int64 counter;
QueryPerformanceCounter((LARGE_INTEGER*) &counter);
return double(counter) / performance_frequency;
}
#else
# error time() not implemented for your platform
#endif
// How many times to repeat the whole test
const int repeats = 10;
// How many times to iterate one case
const int times = 1000000;
// Trick optimizer to not remove code
int result = 0;
// Case 1. No exception thrown nor handled.
void do_something()
{
++result;
}
void case1()
{
do_something();
}
// Case 2. No exception thrown, but handler installed
#ifndef NO_EXCEPTIONS
void do_something_else()
{
--result;
}
void case2()
{
try
{
do_something();
}
catch (int exception)
{
do_something_else();
}
}
// Case 3. Exception thrown and caught
void do_something_and_throw()
{
throw ++result;
}
void case3()
{
try
{
do_something_and_throw();
}
catch (int exception)
{
result = exception;
}
}
#endif // !NO_EXCEPTIONS
void (*tests[])() =
{
case1,
#ifndef NO_EXCEPTIONS
case2,
case3
#endif // !NO_EXCEPTIONS
};
int main()
{
#ifdef NO_EXCEPTIONS
printf("case0\n");
#else
printf("case1\tcase2\tcase3\n");
#endif
for (int repeat = 0; repeat < repeats; ++repeat)
{
for (int test = 0; test < sizeof(tests)/sizeof(tests[0]); ++test)
{
double start = time();
for (int i = 0; i < times; ++i)
tests[test]();
double end = time();
printf("%f\t", (end - start) * 1000000.0 / times);
}
printf("\n");
}
return result; // optimizer is happy - we produce a result
}
Kevin Frei переговоры о стоимости выполнения обработки исключений в его речи" Стоимость Обработки Исключения C++ в Windows ". (В соответствии со "Сводкой & Заключения" существуют один элемент списка, который говорит" [Стоимость выполнения обработки исключений] не всегда измерима".)
Другое примечание по выполнению обработки исключений: простые тесты не принимают кэширование во внимание. Код попытки и код выгоды являются и столь маленькими, что все вписывается в инструкцию и кэши данных. Но компиляторы могут попытаться переместить код выгоды далеко от кода попытки, который уменьшает объем кода для хранения в кэше обычно, таким образом улучшая производительность.
при сравнении обработки исключений с традиционной проверкой возвращаемого значения C-стиля этот эффект кэширования должен быть принят во внимание также (вопрос обычно игнорируется в обсуждениях).
Carl
Нет никакого действительно хорошего способа измерить это в коде. Необходимо было бы использовать профилировщика.
Это не покажет Вам непосредственно, сколько времени проведено с обработкой исключений, но с определенным исследованием, которое Вы узнаете, какой из методов во время выполнения имеет дело за исключениями (например, для VC ++. СЕТЬ это __ cxx_exc [...]).
Складывают их времена, и у Вас есть издержки. В нашем проекте мы использовали vTunes от Intel, которая работает и с Visual C++ и с gcc.
Редактирование: Ну, если Вам просто нужно универсальное число, которое могло бы работать. Мысль, которую у Вас было реальное приложение для профилирования, где Вы не можете только выключить исключения.
Разве ответ не будет зависеть от того, какая очистка должна произойти в результате броска? Если исключение будет выдано, который вызывает целую загрузку объектов выйти из объема стек, то это добавит к издержкам.
, Другими словами, я не уверен, существует ли ответ на 3-й вопрос, который независим от специфических особенностей кода.
Полное изложение о том, как g ++ обрабатывает исключения, показывают здесь. Это описывает это как являющийся для архитектуры Itanium, однако общие используемые методы являются тем же. Это не скажет Вам точные издержки с точки зрения времени, однако можно подобрать, каков грубый код наверху будет.