Hi Ben & Daniel,

On 10/29/2014 07:41 AM, Ben Lopatin wrote:
> Hi Daniel, in this case I would think the latter would fail - the
> `include` function loads a URL conf module and then finds the
> `urlpatterns` attribute, whereas `admin.site.urls` is a class method
> that dynamically builds a list of URL patterns based on your installed
> apps. There's nothing to import in the latter case because there's no
> such `urls` module.

 `include()` can take a list of url patterns directly, too -- it doesn't
have to take a urlconf module with a `urlpatterns` attribute. In fact,
you can use ``include()`` entirely within one module, to include one set
of url patterns within another and reduce prefix repetition:

    profile_patterns = [
        url(r'^$', views.profile),
        url(r'^edit/$', views.edit_profile),
    ]

    urlpatterns = [
        url(r'^$', views.home),
        url(r'^(?P<user_id>\d+)/', include(profile_patterns)),
    ]

> On Tuesday, October 28, 2014 5:51:48 PM UTC-4, Daniel Grace wrote:
> 
>     Hi,
>     In reference to urls.py what is the purpose of the include function?
>      For example what is the difference between these two lines?
>     url(r'^admin/', admin.site.urls),
>     url(r'^admin/', include(admin.site.urls)),

I think in part through historical accident, both ``include()`` and
``url()`` can actually take a triple of (urlpatterns, app_name,
namespace), which is what `admin.site.urls` actually is. So in this
particular case there is in fact no difference.

But this is an odd case. In the more typical cases, you'd pass
`include()` either a string dotted path to a Python module with a
`urlpatterns` attribute which is a list of url patterns, or an actual
Python module object with a `urlpatterns` attribute which is a list of
url patterns, or simply a list of urlpatterns. And in almost every case,
you'd pass `url()` a view callable.

Carl

Attachment: signature.asc
Description: OpenPGP digital signature

Reply via email to