Django中绝对路径的替代方案

时间:2013-07-15 17:44:42

标签: python django django-models django-templates django-views

我正在制作一个Django项目,一个商业目录。 这里我使用ABSOULATE PATHS进行模板渲染, 我觉得这可能会在将来产生问题。 请查看我的代码并建议我如何解决这个问题,以便将来不会产生任何问题。

请帮忙

我的models.py是::

from django.db import models


class Directory(models.Model):

    Bussiness_name = models.CharField(max_length=300)
    Description = models.CharField(max_length=900)
    Number = models.CharField(max_length=100)
    Web_url = models.CharField(max_length=800)
    Catogory = models.CharField(max_length=200)


    def __unicode__(self):
        return self.Bussiness_name

class Adress(models.Model):
   directory =  models.ForeignKey(Directory)
   adress_name =  models.CharField(max_length=300)
   def __unicode__(self):
        return self.adress_name

class Photos(models.Model):
   directory =  models.ForeignKey(Directory)
   Photo_path =  models.CharField(max_length=100)
   Photo_name =  models.CharField(max_length=100)
   def __unicode__(self):
        return self.Photo_name

我的view.py是::

# Create your views here.
from django.http import HttpResponse
from crawlerapp.models import Directory
from crawlerapp.models import Adress
from crawlerapp.models import Photos
from django.template import Context, loader
from django.shortcuts import render

def index(request):
    Directory_list = Directory.objects.all()
    t=loader.get_template('C:/Python27/django/crawler/templates/crawlertemplates/index.html')
    c = Context({'Directory_list': Directory_list,})
    return HttpResponse(t.render(c))

def contactus(request):
    Directory_list = Directory.objects.all()
    t=loader.get_template('C:/Python27/django/crawler/templates/crawlertemplates/contactus.html')
    c = Context({'Directory_list': Directory_list,})
    return HttpResponse(t.render(c))

def search(request):
    if 'what' in request.GET and request.GET['what']:
        what = request.GET['what']
        crawlerapp = Directory.objects.filter(Catogory__icontains=what)
        return render(request, 'C:/Python27/django/crawler/templates/crawlertemplates/search.html',
                  {'crawlerapp': crawlerapp, 'query': what})

    elif 'who' in request.GET and request.GET['who']:
        who = request.GET['who']
        crawlerapp = Directory.objects.filter(Bussiness_name__icontains=who)
        return render(request, 'C:/Python27/django/crawler/templates/crawlertemplates/search.html',
                  {'crawlerapp': crawlerapp, 'query': who})

    else:
        message = 'You submitted an empty form.'
    return HttpResponse(message)

我的urls.py是::

from django.conf.urls import patterns, include, url
# Uncomment the next two lines to enable the admin:
from django.contrib import admin
admin.autodiscover()

urlpatterns = patterns('',
    # Examples:
    # url(r'^$', 'crawler.views.home', name='home'),
    # url(r'^crawler/', include('crawler.foo.urls')),

    # Uncomment the admin/doc line below to enable admin documentation:
    # url(r'^admin/doc/', include('django.contrib.admindocs.urls')),

    # Uncomment the next line to enable the admin:
    url(r'^admin/', include(admin.site.urls)),
    url(r'^crawlerapp/$', 'crawlerapp.views.index'),
    url(r'^crawlerapp/contactus/$', 'crawlerapp.views.contactus'),
    url(r'^crawlerapp/search/$', 'crawlerapp.views.search'),
)

我有3个html页面INDEX,CONTACTUS和SEARCH。 请建议使用绝对路径的替代方法,以便在我从GITHUB克隆它并尝试运行它时不会产生错误。

请帮助解决这个问题。

4 个答案:

答案 0 :(得分:2)

您是否考虑过阅读the Django tutorial?。 不要忘记在settings.py文件中设置TEMPLATE_DIRS,这样做的好建议可以在另一个答案中找到; Django template Path

答案 1 :(得分:2)

您应该在TEMPLATE_DIRS列表中的setting.py文件中列出您的模板目录。

无论您是否这样做,都应该使用os.path模块的功能动态生成绝对路径。

os.path.abspath(__file__)

将返回其所调用文件的绝对路径。

os.path.dirname('some/path')

将返回'some/Path'

中最后一个目录的路径

通过组合它们,您可以得到绝对的路径,这些路径在不同系统上保持准确,例如

os.path.abspath(os.path.dirname(os.path.dirname(__file__)))

将返回到包含当前文件的目录上一级目录的绝对路径。

请阅读os.path模块的docs。您可能也需要使用os.path.join

答案 2 :(得分:2)

在您的项目settings.py文件中:

在顶部添加

import os.path
PROJECT_ROOT = os.path.abspath(os.path.dirname(__file__))

然后设置模板路径:

TEMPLATE_DIRS = (
    os.path.join(PROJECT_ROOT, "templates"),
)

答案 3 :(得分:0)

通过这种方式,您将来有义务重新检查所有文件,以便在您更改目录时更改路径:在settings.py文件中定义:

import os.path

TEMPLATE_DIRS = (
 os.path.join(os.path.dirname(__file__),'templates').replace('\\','/'),
 '/path/to/my/project/'
 '/path/to/my/project/template/', # for the apps
)

其中templates/是模板的目录。