Hello!

I was lazily thinking about making {% url %} and "reverse" to work for 
generic views ("GV"). The main problem why reversing doesn't work for GV 
is that it relies on view's name to be unique while GVs obviously have 
the same name for many URLs (that makes them "generic"). Hence a 
signature of a GV consists not only of its name but also of some (but 
not all) parameters from info_dict.

## A common case

I've failed to invent a good general way of dealing with this and 
decided to go for 80 from 80/20 rule. It looks like in most cases people 
need reversing for GVs pointing to object pages: "object_list" and 
"object_detail". May be also for date based GVs but let's leave them 
aside for a while.

So for "object_list" and "object_detail" I propose this syntax:

     {% obj_url "appname.ModelName" id %}
     {% obj_list_url "appname.ModelName" %}

Both GVs have their own tag that knows the actual name of a GV (like 
"django.views.generic.list_detail.object_list"). Though I like it this 
way it's not set in stone and may be some parameter would be better 
(like {% url "object_detail" "appname.ModelName" %}).

Tags accept a model name as a first argument. This will require a 
special version of "reverse" that checks for a view name and for a model 
name that it knows how to get from a "queryset" parameter from info_dict.

This looks to me both simple for a template tag and useful for most real 
cases.

## More special case

There is one special case that I feel is not that special to not be 
addresses. Sometimes you have to URLs that have the same GVs _and_ 
querysets against the same model:

     (r'/objects/$', object_list, {
       'queryset': Model.objects.all(),
     }),
     (r'/objects/active/$', object_list, {
       'queryset': Model.objects.filter(active=True),
     }),

The distinction by model name won't work here. For this I propose an 
optional fourth member to an urlconf pattern: view's given name:

     (r'/objects/$', object_list, {
         'queryset': Model.objects.all(),
       },
       'objects'),
     (r'/objects/active/$', object_list, {
         'queryset': Model.objects.filter(active=True),
       },
       'active_objects'),

And the tag will accept it as a first parameter:

     {% obj_list_url "active_objects" %}

This will require additional configuration but I think it's okay since 
it's not required for a common case and is simple enough.

This "view name" will also solve other problems: reversing for the rest 
of GVs and may be a permalink decorator that James Bennett was talking 
about in django-user recently.

<small>Now I think that this proposal is better sounds like "introduce 
view names, use model's name for this in known generic views"</small>

So what do you think about it?

--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"Django developers" group.
To post to this group, send email to django-developers@googlegroups.com
To unsubscribe from this group, send email to [EMAIL PROTECTED]
For more options, visit this group at 
http://groups.google.com/group/django-developers?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to