2015-04-19 25 views
9

Django Book, chapter 3 değinen:Bazıları neden Django ihtiyaç dizeleri ve diğerleri değişken adları içeriyor?

bir şey bir dize olarak dahil edilir neden ne belirler
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'^$', 'mysite.views.home', name='home'), 
    # url(r'^mysite/', include('mysite.foo.urls')), 
    # url(r'^admin/doc/', include('django.contrib.admindocs.urls')), 
    # url(r'^admin/', include(admin.site.urls)), 
) 

ve başka düzenli değişken olarak? Neden admin.site.urls fakat 'admin.site.urls' değil? Diğer tüm include s dizeler olarak dahil edilir ... Burada hiçbir mantıksal model görmüyorum.

cevap

6

Her şeyden önce, ilk desen ('mysite.views.home' -> bir görünüm işlevi) 1.8'de kullanımdan kaldırılmıştır: her türlü soruna yol açmıştır.

Diğerlerine gelince, her ikisi de işe yarar. 'mysite.foo.urls', mysite.foo.urls modülündeki kalıpları içerecek şekilde çözümlenmiştir, ancak from mysite.foo import urls as foo_urls; include(foo_urls) da çalışır. Dize tabanlı ithalatlar çoğunlukla kaldırılmamış olan tarihi bir eserdir, ancak bu modül uygundur ve modül hemen alındığı için herhangi bir gerçek dezavantajı yoktur (ve böylece, herhangi bir ImportError url yapılandırmasına kolayca izlenebilirdir). admin.site.urlsolmayan bir modüldür, ancak site bir amacı olup urls bir özniteliktir için

admin.site.urls farklıdır. Bu nedenle, admin.site.urls dize tabanlı ithalat işe yaramaz ve ikinci yöntemi kullanmanız gerekir. Son bir not olarak, son derece güncel olmadığını belirten Django Kitabının başında yer alan uyarı güncelliğini yitirmiştir. Resmi belgeler (bildiğim en iyi resmi belgelerden biri) gibi daha güncel kaynaklar tercih edilebilir.

+0

Burada bir görünümü çağırmak için ne yaparsınız?görünümü içe aktar ve 'url (r '^ $', view_but_not_as_st_, '=' home ')' olarak adlandır? – codyc4321

+1

İçerikleri olmadan: 'mysite.views evden içe aktarma; ... url (r '^ $', ev, isim = 'ev'), ... '. 'include()' sadece mevcut modele yerleştirilmiş diğer modelleri eklemek içindir. – knbk

4

İçinde url() örneklerinin bir listesini eklemek için geçiyorsanız, bir dize kullanmazsınız (bkz. Include() docs ve Including other URLconfs docs). Yönetici URL'ler örneğinizde, admin.site.urls, URL örneklerinin bir listesini belirtir. source code'daki (admin.site.urls ile belirtilen URL örneklerinin listesini sağlayan) get_urls yöntemine bakın.

def get_urls(self): 
    ... 
    # Admin-site-wide views. 
    urlpatterns = [ 
     url(r'^$', wrap(self.index), name='index'), 
     url(r'^login/$', self.login, name='login'), 
     url(r'^logout/$', wrap(self.logout), name='logout'), 
     url(r'^password_change/$', wrap(self.password_change, cacheable=True), name='password_change'), 
     url(r'^password_change/done/$', wrap(self.password_change_done, cacheable=True), 
      name='password_change_done'), 
     url(r'^jsi18n/$', wrap(self.i18n_javascript, cacheable=True), name='jsi18n'), 
     url(r'^r/(?P<content_type_id>\d+)/(?P<object_id>.+)/$', wrap(contenttype_views.shortcut), 
      name='view_on_site'), 
    ] 
+0

2 yeşil ok koyabilseydim, size bir tane verirdim – codyc4321

3

Bu biraz kafa karıştırıcı haklısınız. Bunu Django 1.8'de değiştirdiler, şimdi sadece normal değişkenleri de destekliyorlar.

Django 1.8 release note adresinde daha fazla bilgi bulabilirsiniz.

+0

Verilen bağlantı genel olarak URLconfs değil, görünümlere başvurmak içindir – Jesuisme

3

Bir string içeren bir yolu, include() işlevine koymanız gerekir. kodun başında bir argüman olarak alabilir), sen bir içe Django 1.8 belgelerine

3

var (içerdiğinden Ama admin.site.urls bir dize gibi bir modül VEYA bir modül adı

https://docs.djangoproject.com/en/1.8/ref/urls/#include

hat

from django.contrib import admin 

yönetici modülü ithal ediyor. Böylece, doğrudan dahil olmak üzere bir argüman olarak kullanılabilir. Diğer() yöntemleri, diğer URLconfs'ları adlandıran dize argümanlarına sahiptir.

İlgili konular