Относительные ссылки на файл 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. Это отвратительно, я ненавижу это, но, тем не менее, это делает свою работу