Альтернативная строка, раскрашивающая шаблон Django больше чем с Одним набором строк

Код:

int _print_t(tnode *tree, int is_left, int offset, int depth, char s[20][255])
{
    char b[20];
    int width = 5;

    if (!tree) return 0;

    sprintf(b, "(%03d)", tree->val);

    int left  = _print_t(tree->left,  1, offset,                depth + 1, s);
    int right = _print_t(tree->right, 0, offset + left + width, depth + 1, s);

#ifdef COMPACT
    for (int i = 0; i < width; i++)
        s[depth][offset + left + i] = b[i];

    if (depth && is_left) {

        for (int i = 0; i < width + right; i++)
            s[depth - 1][offset + left + width/2 + i] = '-';

        s[depth - 1][offset + left + width/2] = '.';

    } else if (depth && !is_left) {

        for (int i = 0; i < left + width; i++)
            s[depth - 1][offset - width/2 + i] = '-';

        s[depth - 1][offset + left + width/2] = '.';
    }
#else
    for (int i = 0; i < width; i++)
        s[2 * depth][offset + left + i] = b[i];

    if (depth && is_left) {

        for (int i = 0; i < width + right; i++)
            s[2 * depth - 1][offset + left + width/2 + i] = '-';

        s[2 * depth - 1][offset + left + width/2] = '+';
        s[2 * depth - 1][offset + left + width + right + width/2] = '+';

    } else if (depth && !is_left) {

        for (int i = 0; i < left + width; i++)
            s[2 * depth - 1][offset - width/2 + i] = '-';

        s[2 * depth - 1][offset + left + width/2] = '+';
        s[2 * depth - 1][offset - width/2 - 1] = '+';
    }
#endif

    return left + width + right;
}

void print_t(tnode *tree)
{
    char s[20][255];
    for (int i = 0; i < 20; i++)
        sprintf(s[i], "%80s", " ");

    _print_t(tree, 0, 0, 0, s);

    for (int i = 0; i < 20; i++)
        printf("%s\n", s[i]);
}

Выход:

                           .----------------------(006)-------.                 
                      .--(001)-------.                   .--(008)--.            
                 .--(-02)       .--(003)-------.       (007)     (009)          
       .-------(-06)          (002)       .--(005)                              
  .--(-08)--.                           (004)                                   
(-09)     (-07)                     

или

                                                  (006)                         
                           +------------------------+---------+                 
                         (001)                              (008)               
                      +----+---------+                   +----+----+            
                    (-02)          (003)               (007)     (009)          
                 +----+         +----+---------+                                
               (-06)          (002)          (005)                              
       +---------+                        +----+                                
     (-08)                              (004)                                   
  +----+----+                                                                   
(-09)     (-07)                                                       
58
задан Carl G 20 January 2009 в 07:00
поделиться

4 ответа

Самое легкое обходное решение (пока патч resetcycle не согласован и применялся), должен использовать встроенный фильтр "divisibleby" с forloop.counter:

{% for entry in blog.entries %}
  <div class="{% if forloop.counter|divisibleby:2 %}even{% else %}odd{% endif %}" id="{{ entry.id }}">
    {{ entry.text }}
  </div>
{% endfor %}

Немного более подробный, но не трудно понять и это работает отлично.

111
ответ дан Carl Meyer 7 November 2019 в 15:19
поделиться

Самый легкий ответ мог бы быть: "сдайтесь и используйте jQuery". Если это приемлемо, это, вероятно, легче, чем борьба с шаблонами Django по чему-то настолько простому.

1
ответ дан Steve Losh 7 November 2019 в 15:19
поделиться

Существует способ сделать это серверная сторона с итератором, который не сохраняет одновременную копию всех записей:

import itertools
return render_to_response('template.html',
  {
    "flattened_entries": itertools.chain(*(blog.entries for blog in blogs)),
  })
-5
ответ дан orip 7 November 2019 в 15:19
поделиться

Сдайтесь и используйте Шаблонная Система Jinja2

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

РЕДАКТИРОВАНИЕ/ПРИМЕЧАНИЕ (я знаю, это походит на большой переключатель для просто незначительной проблемы, но в действительности я держал пари, что Вы всегда боретесь с шаблонной системой по умолчанию в django, таким образом, это действительно стоит, и я полагаю, что это сделает Вас более продуктивными в конечном счете.)

можно читать эта статья, написанная ее автором , хотя это является техническим, он упоминает проблему {% цикла %} тег в django.

Джинджа не имеет тега цикла, она имеет метод цикла на цикле:

{% for user in users %}
    <li class="{{ loop.cycle('odd', 'even') }}">{{ user }}</li>
{% endfor %}

А главное преимущество Jinja2 состоит в том, что это позволяет Вам использовать логику для представления, поэтому если у Вас есть список изображений, можно поместить их в таблицу, потому что можно запустить новую строку в таблице каждый элементы N, посмотрите, можно сделать, например:

{% if loop.index is divisibleby(5) %}   
     </tr>
     {% if not loop.last %}
     <tr>
     {% endif %}
{% endif %}

можно также использовать математические выражения:

{% if x > 10 %}

и можно получить доступ функциям Python непосредственно (но некоторая установка требуется, чтобы определять, какие функции должны быть представлены для шаблона)

{% for item in normal_python_function_that_returns_a_query_or_a_list() %}

даже переменные набора..

{% set variable_name = function_that_returns_an_object_or_something() %} 
2
ответ дан hasen 7 November 2019 в 15:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: