Opened 9 years ago

Closed 8 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: David Danier <goliath.mailinglist@…> Owned by: nobody
Component: Core (Other) Version: master
Severity: trivial Keywords:
Cc: Triage Stage: Ready for checkin
Has patch: yes Needs documentation: no
Needs tests: no Patch needs improvement: no
Easy pickings: UI/UX:

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)

ticket_3291__revision_6467.diff (635 bytes) - added by __hawkeye__ 8 years ago.
Adds ability to pass arguments to get_absolute_url method which are passed through to underlying function

Download all attachments as: .zip

Change History (7)

comment:1 Changed 9 years ago by David Danier <goliath.mailinglist@…>

  • priority changed from normal to lowest
  • Severity changed from major to trivial

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)

comment:2 Changed 9 years ago by mir@…

  • Triage Stage changed from Unreviewed to Design decision needed

comment:3 Changed 8 years ago by ubernostrum

#2140 is a different symptom of the same problem.

Changed 8 years ago by __hawkeye__

Adds ability to pass arguments to get_absolute_url method which are passed through to underlying function

comment:4 Changed 8 years ago by __hawkeye__

  • Has patch set
  • Summary changed from get_absolute_url cannot be encanced with optional parameters, because it gets curried for settings.ABSOLUTE_URL_OVERRIDES (used for {% link_to ... %} implementation) to [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 Changed 8 years ago by SmileyChris

  • Triage Stage changed from Design decision needed to Ready for checkin

I can't see any downsides to adding this functionality.

comment:6 Changed 8 years ago by mtredinnick

  • Resolution set to fixed
  • Status changed from new to closed

(In [6732]) Fixed #3291 -- Allow calling get_absolute_url() with extra positional and
keyword arguments. Not usually required, but useful for people wanting to write
some kinds of customisations. Patch from hawkeye.

Note: See TracTickets for help on using tickets.
Back to Top