Opened 18 years ago
Closed 17 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 , 18 years ago
priority: | normal → lowest |
---|---|
Severity: | major → trivial |
comment:2 by , 18 years ago
Triage Stage: | Unreviewed → Design decision needed |
---|
by , 17 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 , 17 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 , 17 years ago
Triage Stage: | Design decision needed → Ready for checkin |
---|
I can't see any downsides to adding this functionality.
comment:6 by , 17 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)