Относительные ссылки на файл admin.py

Есть класс в admin.py:

class NewsAdmin(TranslationAdmin):
    form = NewsForm
    list_display = ('title', 'date' 'show_url')
    
    def show_url(self, obj):
        return format_html("<a href='http://www.host.ru/news/{url}' target='_blank'>view</a>", url=obj.id)
        
    show_url.short_description = "View"

Нужно ссылку http://www.host.ru заменить на относительную, примерно так: протокол + имя домена + news/{url} Как это можно сделать?

Я думаю, вам лучше сделать это жестко закодированное значение в настройках, например BASEURL = 'http://www.host.ru'
затем иметь разные settings.py для производства и разработки (dev с BASEURL = 'https://localhost:8080' для тестирования)

и затем вы можете получить его с помощью:


def show_url(self, obj):
    from django.conf import settings
    return format_html("<a href='{base}/news/{url}' target='_blank'>view</a>", base=settings.BASEURL, url=obj.id)

# or use reverse so it's dynamically linked to your urls.py (this is what I do)
def show_url_with_reverse(self, obj):
    from django.conf import settings
    from django.urls import reverse
    return format_html("<a href='{base}{url}' target='_blank'>view</a>",
        base=settings.BASEURL,
        url=reverse('myviewname', args=[obj.id])
        )

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


Обоснование

Это все спорно, потому что у вас нет доступа к объекту request внутри этого метода.
Я обнаружил, что вам нужен объект request для динамического получения хоста, www.host.ru часть, с request.get_host().
Но это все равно приводит к http:// и https://, что недоступно везде (что я нашел), поэтому я жестко закодировал это в моем settings.py.

Так что в любом случае что-то придется жестко кодировать, так что с таким же успехом это может быть весь url. Это отвратительно, я ненавижу это, но, тем не менее, это делает свою работу

Вернуться на верх