Django的:链接到模板URL时,函数是在另一个目录视图?(Django: link to url

2019-10-23 05:57发布

我想在这样的模板来显示评论:

{{ url note.note }} 
{{ url note.note_by }}

我的问题是我的模板是在另一个目录从那里认为,“请求”的音符。 如何链接到另一个目录视图(或者更具体地说,在note.note函数内部的views.py在其他目录)?

在同一目录作为模板views.py,我链接到这样的模板:

def blah(request):
   return render(request, 'site/blah.html')

而在我请求和保存的意见(note.note)的views.py看起来就像这样:

def messages(request):
if request.method == "POST":
    new_note_text = request.POST.get('new_note')
    new_note = Note()
    new_note.note = new_note_text  
    new_note.note_by = request.user 
    new_note.note_datetime = timezone.now()
    new_note.save()

return render(request, 'theme/messages.html', context)

编辑:

urls.py在同一目录作为模板:

from django.conf.urls import include, patterns, url
from site import views 

urlpatterns = patterns('', 
url(r'^test$', views.blah, name='blah'),
)

settings.py:

import os

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

SECRET_KEY = ''

# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True

ALLOWED_HOSTS = []


# Application definition

INSTALLED_APPS = (
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'app', 
'theme', 
'site',
 )

 MIDDLEWARE_CLASSES = (
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
'django.middleware.security.SecurityMiddleware',
 )

ROOT_URLCONF = 'app.urls'

TEMPLATES = [
{
    'BACKEND': 'django.template.backends.django.DjangoTemplates',
    'DIRS': [],
    'APP_DIRS': True,
    'OPTIONS': {
        'context_processors': [
            'django.template.context_processors.debug',
            'django.template.context_processors.request',
            'django.contrib.auth.context_processors.auth',
            'django.contrib.messages.context_processors.messages',
        ],
       },
    },
 ]

  WSGI_APPLICATION = 'appen.wsgi.application'


 DATABASES = {
'default': {
    'ENGINE': 'django.db.backends.sqlite3',
    'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
}
}

  LANGUAGE_CODE = 'en-us'

  TIME_ZONE = 'Europe'

  USE_I18N = True

  USE_L10N = True

  USE_TZ = True


  STATIC_URL = '/static/'

Answer 1:

Django的反向链接解析器有一个作业。 这需要输送到它的参数(通过{% url ... %}"模板标签或urlresolves.reverse在Python代码。

只要你的代码是一个有效的Django配置(下)在启动时将目录中的模板和观点是不相关的。 这个特殊的例子假设你已经包含在你的应用程序settings.py配置和你的根urls.py包括条目代表对urls.py在各个应用的文件, mainnotes

- templates
     |
     - main.html
     - notes.html
- main
     |
     - views.py
     - models.py
     - urls.py
- notes
     |
     - views.py
     - models.py 
     - urls.py
- urls.py
- settings.py

你需要什么这个工作

所以首先让我们来看看main我要创建一个视图功能views.py

from django.shortcuts import render

def main(request):
    return render(request, 'main.html', {})

urls.py在进入main/urls.py

from django.conf.urls import url

from . import views

urlpatterns = [
    url(r'^$', main, name='main'),
]

所以这是我的主要观点。 让我们假设我想包括一个<ul>与我的其他应用程序连接到各种注意事项。 首先第一件事情我需要建立一个note/<note_id>视图。 我现在用的<note_id>参数,以解决我的笔记条目。

notes/views.py我创建了一个笔记功能,它接受一个note_id关键字参数。

def notes(note_id=None):
    #... Get note from database and put in context
    return render(request, 'notes.html', {})

然后创建一个notes/urls.py为我们创建的视图条目。

from django.conf.urls import url, patterns
urlpatterns = patterns(
    'main.views',
    url(r'^(?P<note_id>[0-9]+)/?$','notes', name='notes'),
)

然后,我们需要用root来完成这一切共同urls.py文件

from django.conf.urls import include, url

urlpatterns = [
    url(r'^main/', include('main.urls')),
    url(r'^notes/', include('notes.urls')),
]

所以,让我们停下来。 我们有什么权利吗? 我们有一个名为观点main结合contextmain.html的模板,并返回作为响应一些标记。 我们也有一个urls.py条目,它告诉Web服务器如何到达这一观点。 我们有一个叫做视图完全相同的notes在不同的应用程序。 最后,我们有一个根urls.py那个拉我的应用程序特定的urls.py文件到顶层。

什么是我们想要做什么? 我们希望在包括main.html一个<ul>充满了有效的URL引用到我们的笔记。

既然我们已经拥有一切的设置,这是很容易,我们使用{% url ... %}模板标记提供相应的信息来解决我们的项目urls.py文件。

在我们的main.html模板中,我们简单的添加这样的事情...

<ul>
    <li> <a href="{% url "notes" note_id=1 %}">note 1</a></li>
    <li> <a href="{% url "notes" note_id=2 %}">note 2</a></li>
    <li> <a href="{% url "notes" note_id=3 %}">note 3</a></li>
</ul>

main.html被调用的标记上面会是这个样子?

<ul>
    <li> <a href="/notes/1">note 1</a></li>
    <li> <a href="/notes/2">note 2</a></li>
    <li> <a href="/notes/3">note 3</a></li>
</ul>

这里要记住的重要事情是什么urlurlresolver.reverse怎么做。 他们采取一个视图名称和一些参数,它们将它们转换成一个有效的URL作为一个字符串。 它是一种干的做法,因为以后如果更改URL管理notesnotes_important什么的所有模板会自动修复你的一切。



文章来源: Django: link to url in template when function is in a view in another directory?