0

我试图避免必须以某种方式添加一个 context_processor 来将我的项目的基本 url 添加到我在所有模板中使用的每个 url。

我的 django 项目位于一个子目录下(让我们称之为 foo),我的模板中的很多 url 都与此类似:

<a href='/somepath'>whatever</a>

这适用于托管在域根目录上的项目,但在这种情况下,因为我在子目录 foo 下,所以 url 实际上会指向 www.example.com/somepath

有趣的是管理站点运行良好。它所有的 url 都指向 foo/admin/...

我怀疑我不是在寻找正确的术语来找到答案。

.htaccess

AddHandler fcgid-script .fcgi
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ foo.fcgi/$1 [L]

.fcgi

#!/usr/bin/python
import sys, os

# Current Path
cwd = os.path.join( os.path.dirname( os.path.abspath( __file__ ) ) )

# Activate current virtualenv
activate_this = os.path.join( cwd, 'bin', 'activate_this.py' )
execfile( activate_this, dict( __file__ = activate_this ) )

# Add a custom Python path.
sys.path.insert( 0, os.path.join( cwd, 'foo' ) )

os.environ['DJANGO_SETTINGS_MODULE'] = 'foo.settings'
from django.core.servers.fastcgi import runfastcgi
runfastcgi(method="threaded", daemonize="false")

大多数 url 我可以使用 {% url %} 和 FORCE_SCRIPT_NAME 来正常工作,但是对于我在 urls.py 中没有用于 reverse() 的条目的 url,我不确定我是否应该只使用FORCE_SCRIPT_NAME 变量在他们的模板中还是有更好的方法?

4

1 回答 1

0

这是我解决问题的方法。不确定这是否是最好的方法,但现在可以。

  1. 确保您将 FORCE_SCRIPT_NAME 设置为您的子目录
  2. 在与 settings.py 相同的目录中创建了 context_processors.py
  3. 在 CONTEXT_PROCESSORS 下的 settings.py 中添加了 context_processors.url_prefix
  4. 在模板中不能使用 {% url %} 标记的任何地方,只需在前面加上 {{ URL_PREFIX }}

context_processors.py

from django.conf import settings # import the settings file

def url_prefix(request):
    # return the value you want as a dictionnary. you may add multiple values in there.
    return {'URL_PREFIX': settings.FORCE_SCRIPT_NAME}

设置.py

CONTEXT_PROCESSORS = (
    ...,
    'context_processors.url_prefix',
)
于 2013-03-05T19:42:11.200 回答