Hello Jorge,
On Thu, 30 May 2013 12:42:20 +0300, Jorge C. Leitão
<[email protected]> wrote:
Hi Russell Keith-Magee.
Thanks for your criticisms. Let's see if I can answer some of them.
I'd turn this question back onto you -- why *should* the search start
locally? What collisions are you seeing between apps that makes a
global >>search impractical?
Very good question! I think this question is related with your point
Well, no - I can see how you've managed to construct an example where
local search might be useful (although I still don't concede that it
>>couldn't be answered with global lookups). However, what I need to be
convinced is to see an actual use case where this is an issue -- not a
>>synthetic example, but a real world problem.
I.e. in my poor example I was not able to explain myself on the reason
for using local search.
I'm sorry for the extension, but the reason is not so obvious.
Consider the case where in a an app you have an header, with the website
logo and stuff, which you want to be consistent within your website,
>and you have smaller secondary header, (secondary_header.html) which
you want to populate according to a specific app rendering the template.
The "a specific app rendering the template" is not phrase is not
well-defined. Do you mean the app (in INSTALLED_APPS) that registered the
url matched for the current request? The python module where the view
function sits in? The python module whence the call to the template's
render() was made? The python module which loaded the template? These can
all be different things. Talking about "which app" makes some sense if
you're limiting yourself to URL names - but keep in mind that templates
can be (and often are) used outside of an HTTP request/response cycle -
what's the "app" then?
One frequent option is to add a block tag and put your
(appname_secondary_header.html) with the same block tag, and call the
>appname_secondary_header.html in the specific's app view. This is the
standard approach in Django and works great!
The problem is when you try to port this app to another website which
already has that appname. Then you have to change your app's name (the
>directory name). However, this also means you have to change ALL the
template names (or else the templates can also collide), all css, etc...
you >also have to change all views that call the template. Not to
mention the disaster it it if the app is within a version control...
This is not solved by >adding a new folder on the templates directory
with your app's name, because you would also have to change that+the all
the views.
This problem is exactly the same in urls. You set a url naming
convention to be consistent with your app, you port the app to another
site >with conflicting names and BANG.
Now, the reason why this happens is because template and url names have
global scope. The solution people found out to solve this issue (C/C>++,
python, you name it) is to use local scope. For instance python uses
namespaces, which uniquely define a name in relation to PATH or
>something.
In Django, namespaces are ill implemented (again, which is fine for most
cases!) because they are not defined in respect to a path, they are just
a >name chosen by the developer, which is susceptible to collision.
In Python, packages are meant to be portable and the solution is: inside
the package, you use a naming scheme assuming an arbitrary name of the
>package (directory's name). If at some moment you have to change the
package name to avoid collision with other package, you just have to
>change the package's name and *not the content*. The names are
arbitrary because the full name in relation to PATH will include the
name of the >package (e.g. import package.module).
So, if global scope doesn't work, what should them work? The answer
(given by python developers) is local scope, and Django can use exactly
>the same idea as python uses in subclassing: if you want to extend an
app, you put a sub-app within that app.
How would you suggest extending a 3rd party app, then? I assume you're not
suggesting to place my extension inside the source tree of the 3rd party
app.
Python's subclassing is completely disconnected from physical paths - and
you usually have to explicitly name the class you're extending - you don't
inherit it simply by virtue of being in a subfolder. You also give the
new, extended class a brand new name - and at least some code needs to
know that name in order to instantiate the right thing.
If the app extends html, then the extension is like a subclassing: your
sub-app adds some functionality, while keeping other constant. In my
>example of the secondary header, this means that if the sub-app has a
secondary header that it would like to use, then it "overloads" the
parent's >template and calls its own secondary header. It is a design
decision on whether the developer can act on the parent to allow this or
not (in C++ >you use "virtual" to say the method can be overloaded, in
python every method can be overloaded).
The same analogy applies - to extend html you name the template you're
extending, and you give the extended version a new name. Block tags are
simply ways to declare what can be extended, templates would be very
unwieldy otherwise.
So, my suggestion is *not just* about a funny way of searching. When I
mean "local search", it is nothing more than a subclassing scheme,
>where the sub-apps are subclassing the parent app. Local means: "try to
find the functionality in the class, if not found, go to the super"
which >python does internally.
It seems you could achieve what you're after (at least for templates) with
a custom template loader. A variation on the app directories loader [0]
can impose a different search order than the default one that simply
follows the order in INSTALLED_APPS. Am I wrong?
And with this you answer "f*** you this is like designing a hole new
django from scratch". My claim is that I only had to change like 10
lines of
I must say that reading this into Russel (and other)'s replies is very
far fetched (language as well as content), uncalled for, and seems to
expose an assumption that the people here prefer the easy path of swatting
suggestions with a quick "nay". I 'd say the opposite is much closer to
the truth.
code in the actual Django code, produce 2 template tags and make a small
modification on the "render" shortcut (with I named local_render) to
>include current_app. Even if this change is far from proofed to work on
all cases (which I strongly doubt), I believe this idea is an important
>modification that increases the overall consistency of Django framework.
Russell Keith-Magee, I hope this (rather long) explanation provides
in-depth justifications on why this modification is important and
relevant to >real problems.
Cheers,
Jorge
[0]
https://docs.djangoproject.com/en/dev/ref/templates/api/#django.template.loaders.app_directories.Loader
Yishai
--
You received this message because you are subscribed to the Google Groups "Django
developers" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/django-developers?hl=en.
For more options, visit https://groups.google.com/groups/opt_out.