Master/detail с помощью администратора в django

Я гуглил и просматривал документы, но не нашел ничего, связанного с этим сценарием:

У меня есть модель master/detail, определенная так:

class Master(models.Model):
   title = models.CharField(max_length=100)

   def details_url(self):
       return '<a href="here comes the url linking to details">Details</a>'
   details_url.short_description = 'Link to details'
   details_url.allow_tags = True

class Detail(models.Model):
    master = models.ForeignKey(Master)
    details = models.TextField()

Они отображаются в админке с помощью admin.py. Мой вопрос таков:

1) Как я могу сделать свойство details_url в мастер-модели, чтобы при отображении в admin.py пользователь мог щелкнуть его и перейти к списку деталей и увидеть только детали, относящиеся к этому экземпляру мастер-модели?

2) Если это можно сделать только с помощью пользовательского представления, как мне заставить представление создавать страницу, похожую на остальную часть администратора? Я знаю, что могу использовать тот же код шаблона, что и администратор, но есть ли более быстрый способ создать, например, списки, такие как детали в моем случае? Общие представления/классы?

3) Добавление Мастера в list_filter для класса detailsAdmin невозможно из-за количества Мастер-записей. Либо это ...? И даже если бы это было возможно, как я могу установить фильтры с другой страницы, например, если я щелкну ссылку в списке изменений для основной модели, переходящей в список изменений Детали, как я могу настроить фильтрацию для конкретного экземпляра Мастер-модель?

Короче; все, что я хочу, это отфильтровать change_list, чтобы отображать только детали, относящиеся к конкретной основной записи, и повторно использовать как можно больше административного кода/базы функций.


person Weholt    schedule 26.05.2011    source источник


Ответы (1)


До Django 1.2.4 вы могли создавать отфильтрованные ссылки на модели в админке, используя запрос GET следующим образом: http://your_site.com/admin/your_app/detail/?master__id__exact=2.

Но это была небольшая дыра в безопасности, и ее исправили. Теперь вы получите исключение SuspiciousOperation, если попытаетесь отфильтровать свои модели с помощью поиска, который не указан в атрибуте list_filter.

Хотя есть исправление для этого. Это временное решение реализует атрибут valid_lookups, чтобы вы могли выполнять фильтрацию с использованием некоторых поисковых запросов через URL-запрос на получение, не раскрывая эти поисковые запросы в интерфейсе администратора.

Чтобы это работало, вам нужно переопределить метод lookup_allowed() в вашем ModelAdmin. Вот пример кода, подробности см. в сообщении, упомянутом выше.

class DetailAdmin(admin.ModelAdmin):
    valid_lookups = ()
    def lookup_allowed(self, lookup, *args, **kwargs):
        if lookup.startswith(self.valid_lookups):
            return True
         return super(DetailAdmin, self).lookup_allowed(lookup, *args, **kwargs)
person Anton Strogonoff    schedule 09.06.2011