Измените URL объекта модели в списке администратора django, используя переопределение шаблона - PullRequest
1 голос
/ 17 октября 2019

Предположим, у меня есть модель категории, и она была объявлена ​​в admin.py.

Есть две вещи, которые я хочу сделать, используя переопределение шаблона Django.

  • Добавьте кнопку справа рядом с " Добавить категорию + ", которая отображается только на странице списка категорий и переносит меня на другой URL-адрес.
  • Переопределяет URL-адреса объекта категории, чтобы щелкать по каждому из них. Отдельная категория в списке переходит на соответствующие URL
# models.py

class Category(models.Model):
    name = models.CharField(max_length=50, null=True, blank=False)
    LANGUAGE_ENGLISH = 'en'
    LANGUAGE_FRENCH = 'fr'

    LANGUAGES = ((LANGUAGE_ENGLISH, 'English'),(LANGUAGE_FRENCH, 'French'),)

    language = models.CharField(max_length=12, default=LANGUAGE_ENGLISH, choices=LANGUAGES, blank=False)
    created_at = models.DateTimeField(auto_now_add=True)
# admin.py

@admin.register(Category)
class CategoryAdmin(admin.ModelAdmin):
    list_display = ('name', 'language', 'created_at')
    list_filter = ('created_at', 'language')
    search_fields = ('name',)
    date_hierarchy = 'created_at'
    ordering = ['-created_at']

Категория в админ-панели Category in the admin panel Здесь, нажав на Lifestyleили Путешествие должно привести меня к двум внешним URL-адресам.

1 Ответ

1 голос
/ 17 октября 2019

Первое решение:

переопределить list_display_links и изменить поле вручную

Это двухэтапный процесс. Во-первых, нам нужно изменить get_list_display_links поведение по умолчанию.

Глядя на doc и source у django, вы поймете, что в конечном итоге он будет использовать первый элемент в list_display,В вашем классе администратора:

@admin.register(Category)
class CategoryAdmin(admin.ModelAdmin):
    list_display = ('name', 'language', 'created_at')
    list_filter = ('created_at', 'language')
    list_display_links = [] #< With this, you still can add up a link to your original admin
    search_fields = ('name',)
    date_hierarchy = 'created_at'
    ordering = ['-created_at']

    def get_list_display_links(self, request, list_display):
        """
        Return a sequence containing the fields to be displayed as links
        on the changelist. The list_display parameter is the list of fields
        returned by get_list_display().
        """
        if self.list_display_links or self.list_display_links is None or not list_display:
            # We make sure you still add your admin's links if you explicitly declare `list_display_links`
            return self.list_display_links 
        else:
            # We return empty list instead of `list_display[:1]`
            # if no `list_display_links` is provided.
            return []

Затем, используя этот ответ , вы можете настроить любой столбец.

Второе решение:

Представление «Обработка изменений»себя

В вашем классе администратора:

@admin.register(Category)
class CategoryAdmin(admin.ModelAdmin):
   #... same things as you have

   def change_view(self, request, object_id, form_url="", extra_context=None):
       #Now, you can do pretty much whatever: it's a function based view!

Я бы порекомендовал первое, так как я считаю, что администратор по умолчанию change_view всегда полезен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...