Мастер / деталь с использованием админа в Django - PullRequest
1 голос
/ 26 мая 2011

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

Я получил модель мастер / деталь, определенную так:

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 в Master-модели таким образом, чтобы при отображении в admin.py пользователь мог щелкнуть по нему и перейти к списку деталей и просмотреть только связанные деталик этому экземпляру Master-модели?

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

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

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

1 Ответ

2 голосов
/ 09 июня 2011

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

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

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

Чтобы это работало, вам нужноВам нужно будет переопределить метод 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)
...