2010-11-09 1 views
0

Я пытаюсь отобразить таблицу значений html с примерно 20 столбцами, где говорят, что пользователи-сотрудники видят один поднабор столбцов, а пользователи, не являющиеся сотрудниками, видят другое подмножество столбцов. Возможно, я захочу позже определить другие типы пользователей. Теперь прямо сейчас у меня есть три статические строки заголовка, так что шаблон выглядитОпределить переменные в шаблоне на основе штата пользователей или нет

<table> 
<tr> 
    <th>Col A</th> 
    {% if user.is_staff %}<th>Col B</th>{% endif %} 
    ... 
    {% if not user.is_staff %}<th>Col K</th>{% endif %} 
</tr> 
<tr> 
    <td>Col A second header</td> 
    {% if user.is_staff %}<td>Col B second header</td>{% endif %} 
    ... 
    {% if not user.is_staff %}<td>Col K second header</td>{% endif %}</tr> 
<tr><td>Col A third header</td> ... </tr> 

{% for obj in object_list %} 
<tr> 
    <td>{{ obj.col_a }}</td> 
    {% if user.is_staff %}<td>{{ obj.col_b }}</td>{% endif %} 
    ... 
    {% if not user.is_staff %}<td>{{ obj.col_k }}</td>{% endif %} 
</tr> 
{% endfor %}</table> 

Однако, я считаю, не-DRY, как каждый раз, если я хочу изменить, если тип пользователь может видеть колонку, я должен измените его на 4 места. Или, если я хочу определить несколько разных классов пользователей, мне придется иметь сложные операторы if. Я предпочел бы что-то вроде

{% if show_col_a %}<td>{{obj.col_a }}</td>{{% endif %} 

Где я могу определить в верхней части шаблона (или, возможно, в представлении), что user.is_staff можно увидеть show_col_a. Что-то вроде этого возможно? Я использую общий вид (object_list). Может быть, изменить всех пользователей, чтобы иметь атрибуты user.show_col_a как-то и делать {% if user.show_col_a%}? Я не уверен, как добавить логические атрибуты для пользователей.

EDIT: Может потребоваться несколько пользователей с пользовательскими представлениями (например, staff_view; admin_view, непривилегированные и т. Д.), Поэтому, если утверждения будут неудобными. Содержимое ячейки обычно сложнее, чем {{obj.col_b}}; попробовал упростить задачу, чтобы добраться до точки. Например:

<td>{% if obj.custom_address %} 
    {{ obj.custom_address.webprint|safe }} 
{% else %} 
    {{ obj.business.address.webprint|safe }} 
{% endif %}</td> 

Также в то время как несколько шаблонов будет работать с простым переключателем, как: {%, если user.is_staff%} {% включают "template_staff.html" %} {% еще%} {%, если user.is_admin%} {% включают "template_admin.html" %} {% еще%} {% включают "template_other.html" %} { % ENDIF%} { % ENDIF%}

I не находите его НЕ СУХОЙ; например, каждое редактирование шаблона должно быть реплицировано в три шаблона. Думаю, я мог бы создать скрипт, который читает, генерирует три шаблона из некоторого super_template за пределами django, но его становится очень неэлегантным.

ответ

2

Это зависит от того, какой вид у вас есть и шаблоны.

способов сделать:

  • сделать шаблон и шаблон персонала государственного и добавить простой способ изменить шаблоны на лета взглядов.
  • сделать тег шаблона:

    {% is_staff MyVar%}

код тега:

class IsStaffNode(Node): 
    def __init__(self, var): 
     self.var = var 

    def render(self, context): 
     if context['user'].is_staff(): 
      return var.resolve(context) 
     return "" 


@register.tag 
def is_staff(parser, token): 
    var = parser.compile_filter(token.split_contents()[1]) 
    return IsStaffNode(var) 

Домашнее задание: сделать его блок тег включают тд, так что это отображается либо все, либо нет.

{% isstaff myvar %}<td>{{ myvar }}</td>{% endisstaff %} 

Этот способ более трудоемкий, чем 2 различных шаблонов, но если вы хотите попробовать, манипулируя контекст (или создать отдельный контекст для блока только) might be useful.

  • Сделать контекстный процессор, который заполнит контекст некоторыми переменными, если пользователь является персоналом, или нет, если нет.
  • Создайте тег, который будет содержать шаблон (наследовать от IncludeNode) и манипулировать контекстом.
+0

Предпочитают не иметь шаблона для каждого пользовательского класса (который может распространяться на несколько классов пользователей позже, будет трудно поддерживать). Скорее всего, есть словарь привилегий, связанных с пользователями или пользователями группы. Я вижу, как я могу изменить ваш IsStaffNode.render, чтобы изменить return «» + var.resolve (контекст) + «», но много раз строка в таблице сложнее, чем я допускал; например, имеет операторы if в ячейке. –