在settings.py中让django SITEURL保持不变的方法

Haf*_*fiz 2 python django django-urls

我来自PHP背景,我知道常量可以在框架中的大多数地方访问,我认为它在django中也是一样的.我试图在django中拥有该URL,但我试图从django.contrib获取它.我试图利用django的Site类并导入它.但问题是在加载settings.py时我无法导入任何django contrib.文件.

那么,如何让网站URL自动,我可以在任何地方使用,模板以及其他places.What是这样做的最佳方法是什么?任何python实用程序都可以这样做吗?

And*_*ard 8

无论您在settings.py中定义了什么,例如

SITE_URL = 'http://www.mydomain.com'
Run Code Online (Sandbox Code Playgroud)

可以在所有与Django相关的代码中访问:

from django.conf import settings #this imports also your specific settings.py

print settings.SITE_URL
Run Code Online (Sandbox Code Playgroud)

要不就 Site.objects.get_current().domain

如果您希望能够在模板中访问它,则可以创建自己的模板上下文处理器.把它放在my_project/content_processor.py中

from django.conf import settings
def my_site_url(request):
    return {
        'SITE_URL': settings.SITE_URL,
    }
Run Code Online (Sandbox Code Playgroud)

或者如果你想要它动态:

from django.conf import settings
def my_site_url(request):
    return {
        'SITE_URL': Site.objects.get_current().domain,
    }
Run Code Online (Sandbox Code Playgroud)

并将其添加到settings.py中的TEMPLATE_CONTEXT_PROCESSORS变量中.它看起来应该类似于之后:

TEMPLATE_CONTEXT_PROCESSORS =("django.contrib.auth.context_processors.auth",
"django.core.context_processors.debug",
"django.core.context_processors.i18n",
"django.core.context_processors.media",
"django.core.context_processors.static",
"django.core.context_processors.tz",
"django.contrib.messages.context_processors.messages",
"my_project.context_processors.my_site_url",
)
Run Code Online (Sandbox Code Playgroud)

并完成.

  • 除了您提供的详细信息之外,我还希望尽量减少硬编码设置,我希望settings.py中的这个SITE_URL像`Site.objects.get_current()一样动态.domain`动态获取URL,因为我不知道在django中看到任何类型的助手,比如我将它们设置在某个地方,然后随处访问它,如果有类似帮助器的东西,那么我也可以访问django的Site类. (3认同)