Функция URL шаблона django не совпадает в приложении - PullRequest
0 голосов
/ 26 ноября 2009

У меня есть проект django с приложением pub. Я пытаюсь настроить его так, чтобы я мог включить urls.py из каждого приложения (будет больше по мере того как я иду) в urls.py верхнего уровня. У меня также есть шаблон, который использует функцию 'url' для определения URL-адреса представления, определенного в модуле openidgae. Проблема в том, что после того, как httprequest направляется на pub.views.index (как это и должно быть), я пытаюсь ответить путем рендеринга шаблона, который использует функцию шаблона url. Код, который я показываю ниже, также находится здесь: http://gist.github.com/243158

Вот мой верхний уровень urls.py:

from django.conf.urls.defaults import *

urlpatterns = patterns('',
   (r'', include('openidgae.urls')),
   (r'^pub', include('pub.urls')),  
)

и pub / urls.py:

from django.conf.urls.defaults import *

urlpatterns = patterns('',
   (r'', 'pub.views.index'),
   (r'^/$', 'pub.views.index'),
)

и templates / base.html:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>{% block title %}My amazing site{% endblock %}</title>
</head>
<body>
    <div id="header">
     {% if lip %}
        Welcome {{ lip.pretty_openid }}
        <a href="{% url openidgae.views.LogoutSubmit %}">logout</a>
     {% else %}
        <form id="login-form" action="{% url openidgae.views.OpenIDStartSubmit %}?continue={{continueUrl}}" method="post">
            <input type="text" name="openid_identifier" id="openid_identifier" />
            <input type="submit" value="Verify" />
        </form>

        <!-- BEGIN ID SELECTOR --> 
        <script type="text/javascript" id="__openidselector" src="https://www.idselector.com/selector/46b0e6d0c8ba5c8617f6f5b970865604c9f87da5" charset="utf-8"></script>
        <!-- END ID SELECTOR -->
     {% endif %}
    </div>
{% block content %}{% endblock %}
</body>
</html>

и templates / pub / index.html:

{% extends "base.html" %}

{% block title %}blahblah!{% endblock %}

{% block content %}
  blahblahblah
{% endblock %}

и, наконец, pub / views.py:

from django.shortcuts import render_to_response
from django.http import HttpResponse
from django import forms
import openidgae

def index(request):
    lip = openidgae.get_current_person(request, HttpResponse())
    resp = render_to_response('pub/index.html', {'lip': lip})
    return resp

Теперь, если я установлю второй шаблон в моем urls.py верхнего уровня, чтобы он указывал прямо на 'pub.views.index', все будет работать так, как должно, но не в том случае, если я использую функцию включения.

Есть идеи? Я уверен, что проблема как-то связана с urlpattern, который сопоставляет представления, которые я пытаюсь разрешить, с URL-адресами, недоступными для функций рендеринга шаблонов, когда HttpRequest обрабатывается приложением pub, а не верхним уровнем. , но я не понимаю, почему или как это исправить.

Ответы [ 2 ]

1 голос
/ 26 ноября 2009

Я не понимаю, в чем проблема, с которой вы сталкиваетесь, но, просто взглянув на ваши файлы urls.py, вы, вероятно, должны изменить верхний уровень urls.py на что-то вроде

from django.conf.urls.defaults import *

urlpatterns = patterns('',
   (r'', include('openidgae.urls')),
   (r'^pub/', include('pub.urls')),  
)

и pub/urls.py to:

from django.conf.urls.defaults import *

urlpatterns = patterns('',
   (r'^$', 'pub.views.index'),
)

если вы затем используете {% url pub.views.index %} где-то в своих шаблонах, вы должны получить правильный URL.

0 голосов
/ 27 ноября 2009

Вы публикуете много кода, но не совсем понимаете, в чем проблема. Прежде всего, имея

(r'', 'pub.views.index'),
(r'^/$', 'pub.views.index'),

может вызвать некоторые проблемы, если вы хотите найти URL. Каким должен быть URL для pub.views.index? Из того, что вы говорите, это на самом деле не является проблемой, так как у вас нет тега шаблона, который хочет полностью изменить упомянутое представление. Вы на самом деле не говорите, что происходит не так. Но способ решения вышеуказанной проблемы, если вы хотите сохранить эти два URL-адреса, заключается в использовании именованных URL-адресов. Я нахожу это несколько излишним, поскольку вы можете просто перенаправить example.com/pub на example.com/pub/, но вы можете преобразовать вышеприведенное в:

url(r'', 'pub.views.index' name='pub_a'),
url(r'^/$', 'pub.views.index', name='pub_b'),

Делая это, вы теперь можете изменить свой URL, поскольку вы можете однозначно идентифицировать их, используя {% url pub_a %} или {% url pub_b %}. Это также облегчит чтение ваших шаблонов, так как вы сможете давать имена, которые что-то значат, так что будет легче запомнить, что происходит, при этом быть более кратким.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...