2016-03-23 17 views
2

Ich begann vor kurzem mit der Entwicklung von Django 1.9 für Python. Ich bin auch ein Neuling in Python. Arbeite einfach durch Beispiele und Codes, um Dinge zu lernen. kam ich einschließlich in django.conf.urls, die, wenn ich Fehler verursachte verursacht. Ich konnte nicht verstehen, warum das war? Weil ich es an anderen Stellen benutzt habe, die keine Fehler verursachen."Include" funktioniert seltsam

from django.conf.urls import url, include 
from accounts import views as acc_views 
urlpatterns = [ 
    url(r'^home$', acc_views.home, name='accounts_home'), 
] 

Unten ist, wenn dies einen Fehler gibt. Hier

urlpatterns = [ 
    url(r'^home$', include(acc_views.home), name='accounts_home'), 
] 

ist die Ausnahme:

Unhandled exception in thread started by <function check_errors.<locals>.wrapper at 0x035424F8> 
Traceback (most recent call last): 
    File "C:\Python35-32\VirtualENV\socialnetwork296\lib\site-packages\django\core\urlresolvers.py", line 419, in url_patterns 
    iter(patterns) 
TypeError: 'function' object is not iterable 

During handling of the above exception, another exception occurred: 

Traceback (most recent call last): 
    File "C:\Python35-32\VirtualENV\socialnetwork296\lib\site-packages\django\utils\autoreload.py", line 226, in wrapper 
    fn(*args, **kwargs) 
    File "C:\Python35-32\VirtualENV\socialnetwork296\lib\site-packages\django\core\management\commands\runserver.py", line 116, in inner_run 
    self.check(display_num_errors=True) 
    File "C:\Python35-32\VirtualENV\socialnetwork296\lib\site-packages\django\core\management\base.py", line 426, in check 
    include_deployment_checks=include_deployment_checks, 
    File "C:\Python35-32\VirtualENV\socialnetwork296\lib\site-packages\django\core\checks\registry.py", line 75, in run_checks 
    new_errors = check(app_configs=app_configs) 
    File "C:\Python35-32\VirtualENV\socialnetwork296\lib\site-packages\django\core\checks\urls.py", line 13, in check_url_config 
    return check_resolver(resolver) 
    File "C:\Python35-32\VirtualENV\socialnetwork296\lib\site-packages\django\core\checks\urls.py", line 27, in check_resolver 
    warnings.extend(check_resolver(pattern)) 
    File "C:\Python35-32\VirtualENV\socialnetwork296\lib\site-packages\django\core\checks\urls.py", line 27, in check_resolver 
    warnings.extend(check_resolver(pattern)) 
    File "C:\Python35-32\VirtualENV\socialnetwork296\lib\site-packages\django\core\checks\urls.py", line 23, in check_resolver 
    for pattern in resolver.url_patterns: 
    File "C:\Python35-32\VirtualENV\socialnetwork296\lib\site-packages\django\utils\functional.py", line 33, in __get__ 
    res = instance.__dict__[self.name] = self.func(instance) 
    File "C:\Python35-32\VirtualENV\socialnetwork296\lib\site-packages\django\core\urlresolvers.py", line 426, in url_patterns 
    raise ImproperlyConfigured(msg.format(name=self.urlconf_name)) 
django.core.exceptions.ImproperlyConfigured: The included URLconf '<function home at 0x03D45A50>' does not appear to have any patterns in it. If you see valid patterns in the file then the issue is probably caused by a circular import. 

Was umfassen ist eigentlich tun?

+0

Welchen Fehler haben Sie? –

+0

Hier ist der Fehler, http://hastebin.com/akilovumow.tex –

+1

Bitte fügen Sie den Fehler zu Ihrer Frage durch Bearbeiten, anstatt eine externe Website zu verknüpfen! –

Antwort

2

include funktioniert, indem die URLs des anderen django-Moduls eingeschlossen werden und die aktuelle Definition als Root unter anderen verwendet wird.

Django doc hat eine sehr umfassende Erklärung darüber, ich werde sie hier zitieren:

from django.conf.urls import include, url 

from apps.main import views as main_views 
from credit import views as credit_views 

extra_patterns = [ 
    url(r'^reports/$', credit_views.report), 
    url(r'^reports/(?P<id>[0-9]+)/$', credit_views.report), 
    url(r'^charge/$', credit_views.charge), 
] 

urlpatterns = [ 
    url(r'^$', main_views.homepage), 
    url(r'^help/', include('apps.help.urls')), 
    url(r'^credit/', include(extra_patterns)), 
] 

Hier die include(extra_patterns) würde credit/ als Root-URL verwenden und erkennen, alle anderen in extra_patterns definiert Urls als eine Erweiterung der URL-Definition, um URLs zu entsprechen. Dies vermeidet doppelte Definitionen wie credit/reports, credit/charge usw.

Dasselbe gilt für include('apps.help.urls'), es würde alle URLs enthalten, die im Modul apps.help.urls mit Basis-URL definiert sind, wie help/. Sie müssen also nicht alle URLs an einem Ort definieren.

+0

danke, das ist ziemlich gründlich. 'url (r '^ admin /', include (admin.site.urls)),' funktionieren auch ohne * include *. Warum? –

+0

Entschuldigung, ich verstehe deine Frage nicht, funktioniert es ohne das 'include'? –

+0

ja, tut es. funktioniert –

5

Sie zu sein scheinen ein view einschließlich eher als ein urls Modul

url(r'^home$', include(acc_views.home), name='accounts_home'), 

url(r'^account/', include(account.urls, namespace='accounts'), 

entworfen einschliessen ist sollte es einfach zu machen, die Muster zwischen verschiedenen urls.py Dateien zu verknüpfen, Um keine separate Ansicht einzubeziehen, können Sie die Ansicht direkt in einer URL aufrufen, wie Sie es normalerweise tun würden.

Was beinhaltet eigentlich?

können Sie sehen die source code here

es im Wesentlichen nach Mustern in einer urlpatterns Variable definiert aussieht.

0
Unhandled exception in thread started by <function check_errors.<locals>.wrapper at 0x035424F8> 
Traceback (most recent call last): 
    File "C:\Python35-32\VirtualENV\socialnetwork296\lib\site-packages\django\core\urlresolvers.py", line 419, in url_patterns 
    iter(patterns) 
TypeError: 'function' object is not iterable 

Das sagt Ihnen alles, was Sie wissen sollten. Eine Funktion ist nicht iterierbar. Wenn Sie read the docs sehen Sie, dass Sie eines dieser verwenden können:

include(module, namespace=None, app_name=None)[source] 
include(pattern_list) 
include((pattern_list, app_namespace), namespace=None) 
include((pattern_list, app_namespace, instance_namespace)) 

Sie es eine Funktion übergeben, würde ich raten, mit acc_views.home. Sie möchten wahrscheinlich 'acc_views.home' die Zeichenfolge oder etwas zu diesem Zweck, nicht das eigentliche Modul.