Настройка индекса администратора: возможно ли получить исходное название модели? - PullRequest
0 голосов
/ 28 декабря 2011

Я пытаюсь настроить индекс администратора приложения с открытым исходным кодом, не меняя слишком много вещей.

Я подумал, что могу легко сделать то, что мне нужно, просто проверив название моделей, содержащихся в app_list.моделей.Что-то вроде:

if model is "interface" or "device":
    show it

Но я не могу найти значение, которое не меняется в зависимости от настроек и языка экземпляра django.

, если я печатаю некоторую информацию в шаблонес:

{{ app_list.1.models.2 }}

Я получаю:

{'perms':
  {'add': True, 'change': True, 'delete': True},
  'add_url': '/nodeshot-server/admin/nodeshot/interface/add/',
  'admin_url': '/nodeshot-server/admin/nodeshot/interface/',
  'name': <django.utils.functional.__proxy__ object at 0x7f67fced6ed0>
 }

Add_url и admin_url зависят от настроек, влияющих на мой локальный экземпляр "nodehot-server" - это папка проекта, пока он онлайнэто просто "/ admin / nodehot / ecc."Ключ имени также ненадежен, поскольку он зависит от используемого языка, поэтому, если язык является итальянским, ключ имени будет не «интерфейсом», а «интерфейсом».

Существует ли способ получить оригиналназвание модели (вместо переведенной) без изменения вида?Я действительно не знаю, что такое "django.utils.functional ._ proxy ", хотя это выглядит как механизм ленивой оценки.

Если это невозможно, я полагаю, мне придется написатьпользовательский вид для индекса администратора .. верно?

Ответы [ 3 ]

1 голос
/ 28 декабря 2011

Два варианта здесь. Во-первых, да, вы можете просто переопределить AdminSite.index и передать все, что вам нравится, в контекст. Если вы воспользуетесь этим подходом, вам придется создать и использовать подкласс AdminSite и зарегистрировать свои приложения вручную (admin.autodiscover() больше не будет работать).

Второй вариант - попытаться использовать предоставленную вами информацию. admin_url может частично меняться в зависимости от контекста, но последний фрагмент /nodeshot/interface всегда будет одинаковым для этого приложения и модели. Вы можете использовать регулярное выражение для поиска этой части и ответить соответственно. Тем не менее, поскольку вы находитесь в шаблоне в этот момент, вам придется создать собственный тег шаблона или фильтр, чтобы сделать работу. Фильтр, вероятно, будет вашим лучшим выбором. Вы можете передать ей модель dict и вернуть логическое значение, которое затем сможете использовать внутри if операторов.

nodeshot / templatetags / nodeshot_filters.py

import re

@register.filter
def goes_in_different_table(model_dict):
    if re.search(r'/nodeshot/interface/', model_dict['admin_url']):
        return True

    return False

шаблоны / админ / app_index.html

{% load nodeshot_filters %}

{% if model|goes_in_different_table %}
    <!-- do something -->
{% endif %}
0 голосов
/ 10 января 2012

Правильный ответ на этот вопрос:

Используйте бит, который не изменяется в предложении if:

{% if '/nodeshot/interface/' in model.admin_url %}
0 голосов
/ 28 декабря 2011

Вы можете переопределить шаблон администратора для каждой модели. И не дублируйте весь файл шаблона, переопределите только тот блок шаблона, который вы хотите изменить.

...