2009-11-26 9 views
0

J'ai un projet django mis en place avec une application appelée pub. J'essaie de le configurer de sorte que je puisse inclure urls.py de chaque application (il y en aura plus comme je vais) dans le urls.py de haut niveau. J'ai aussi un template qui utilise la fonction 'url' pour résoudre une url sur une vue, définie dans le module openidgae. Le problème est que, après l'HTTPRequest est acheminé vers pub.views.index (comme il est censé), je tente de répondre en rendant un modèle qui utilise le modèle fonction « url ». Le code que je montre ci-dessous est également ici: http://gist.github.com/243158fonction url modèle de django ne correspondant pas à l'application

Voici mon urls.py haut niveau:

from django.conf.urls.defaults import * 

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

et pub/urls.py:

from django.conf.urls.defaults import * 

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

et modèles/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> 

et modèles/pub/index.html:

{% extends "base.html" %} 

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

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

et enfin, 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 

Maintenant, si je mets le deuxième motif dans mon urls.py haut niveau pour pointer directement vers 'pub.views.index', tout fonctionne comme il se doit, mais pas si j'utilise la fonction include.

Des idées? Je suis sûr que le problème a quelque chose à voir avec le URLPATTERN qui tracerait les vues que je suis en train de se résoudre à ne pas être urls disponibles au rendu modèle fonctions lorsque le HttpRequest est géré par l'application de pub plutôt que par le haut niveau , mais je ne comprends pas pourquoi ou comment y remédier.

Répondre

0

que vous publiez beaucoup de code, mais vous n'avez pas été très clair sur ce que le problème réel est. Tout d'abord ayant

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

peut donner quelques problèmes si vous voulez trouver l'URL. Quel devrait être le url pour pub.views.index? D'après ce que vous dites, ce n'est en fait pas un problème, puisque vous n'avez pas de balise de gabarit qui veut inverser la vue mentionnée. Vous ne dites pas ce qui ne va pas. Mais un moyen de résoudre le problème ci-dessus, si vous voulez garder les deux URL, serait d'utiliser des URLs nommés. Je trouve un peu redondant puisque vous pouvez simplement rediriger example.com/pub à example.com/pub/, mais vous pouvez transformer le dessus:

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

Ce faisant, vous êtes en mesure d'inverser votre URL, comme vous pouvez les identifier de façon unique ou faire {% url pub_a %}{% url pub_b %}. Cela rendra également vos modèles plus faciles à lire, car vous pouvez donner des noms qui signifient quelque chose, il est donc plus facile de se souvenir de ce qui se passe, tout en étant plus concis.

+0

Oui, je n'ai pas très bien édité ma question. Le problème est ici: '{% url openidgae.views.LogoutSubmit%}'. Je pense que je l'ai corrigé, mais je ne comprends toujours pas comment fonctionnent les URLconfs. Je sais que ce n'est pas si compliqué, mais cela prend du temps quand on se contente de sauter la tête en premier au lieu d'étudier les docs. –

1

Je ne comprends pas ce que le problème est que vous êtes confronté, mais juste en regardant vos fichiers urls.py, vous devriez probablement changer le niveau supérieur urls.py à quelque chose comme

from django.conf.urls.defaults import * 

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

et pub/urls.py à:

from django.conf.urls.defaults import * 

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

si vous utilisez ensuite {% url pub.views.index %} quelque part dans vos modèles, vous devez obtenir l'URL correcte.

Questions connexes