Opened 19 years ago
Closed 18 years ago
#3291 closed enhancement (fixed)
[patch] get_absolute_url cannot be encanced with optional parameters, because it gets curried for settings.ABSOLUTE_URL_OVERRIDES (used for {% link_to ... %} implementation)
| Reported by: | Owned by: | nobody | |
|---|---|---|---|
| Component: | Core (Other) | Version: | dev |
| Severity: | trivial | Keywords: | |
| Cc: | Triage Stage: | Ready for checkin | |
| Has patch: | yes | Needs documentation: | no |
| Needs tests: | no | Patch needs improvement: | no |
| Easy pickings: | no | UI/UX: | no |
Description
If you want to have (optional) extra parameters for get_absolute_url(), that's not possible because this method gets curried (because of ABSOLUTE_URL_OVERRIDES). But optional extra-parameters could be an enhancement and a simple way of creating URLs using parameters (for example some URL to edit the object).
I wanted to use this, because I tried to implement an link_to-template tag that can get parameters to add extra functionality to the simple get_absolute_url()-method. This would allow a simple way to get links for object-actions like edit/delete/move/...
It can be fixed by allowing *args and kwargs in django.db.models.base.get_absolute_url:
def get_absolute_url(opts, func, self, *args, **kwargs):
return settings.ABSOLUTE_URL_OVERRIDES.get('%s.%s' % (opts.app_label, opts.module_name), func)(self, *args, **kwargs)
If someone is interested...the template-tag-code:
from django import template
from django.template import loader
class LinkToNode(template.Node):
def __init__(self, context_var_name, kwargs):
self.context_var_name = context_var_name
self.kwargs = kwargs
def render(self, context):
print self.kwargs
try:
obj = template.resolve_variable(self.context_var_name, context)
except template.VariableDoesNotExist:
return ''
try:
return obj.get_absolute_url(**self.kwargs)
except:
return ''
def link_to(parser, token):
tokens = token.contents.split()
# Now tokens is a list like this:
# ['link_to', 'article', 'foo=bar']
# ['link_to', 'article', 'foo=bar', 'bla=fasl']
if len(tokens) < 1:
raise template.TemplateSyntaxError, "%r tag requires more than one argument" % tokens[0]
context_var_name = tokens[1]
kwargs = dict([tuple(part.split('=')) for part in tokens[1:] if '=' in part])
return LinkToNode(context_var_name, kwargs)
Template example:
{% link_to object action=edit %}
Perhaps there is some really good reason not to do it this way...?
(The args/kwargs that are passed to get_absolute_url() could be filtered like done in the dispatcher I think)
Attachments (1)
Change History (7)
comment:1 by , 19 years ago
| priority: | normal → lowest |
|---|---|
| Severity: | major → trivial |
comment:2 by , 19 years ago
| Triage Stage: | Unreviewed → Design decision needed |
|---|
by , 18 years ago
| Attachment: | ticket_3291__revision_6467.diff added |
|---|
Adds ability to pass arguments to get_absolute_url method which are passed through to underlying function
comment:4 by , 18 years ago
| Has patch: | set |
|---|---|
| Summary: | get_absolute_url cannot be encanced with optional parameters, because it gets curried for settings.ABSOLUTE_URL_OVERRIDES (used for {% link_to ... %} implementation) → [patch] get_absolute_url cannot be encanced with optional parameters, because it gets curried for settings.ABSOLUTE_URL_OVERRIDES (used for {% link_to ... %} implementation) |
It is not currently possible to modify the method signature of get_absolute_url.
We use this simple patch internally and provide defaults for any arguments so that get_absolute_url behaves as expected, but allows for multiple URL schemes per object.
Note: The provided patch does not include the template tag code.
comment:5 by , 18 years ago
| Triage Stage: | Design decision needed → Ready for checkin |
|---|
I can't see any downsides to adding this functionality.
comment:6 by , 18 years ago
| Resolution: | → fixed |
|---|---|
| Status: | new → closed |
Done this using a second method to get the url now, so I lower the priority/severity. But perhaps someone could look after this anyway.
(second method has one advantage btw: you can use the result of get_absolute_url() there, which makes thing easier)