Skip to content

Instantly share code, notes, and snippets.

@Znack
Created December 6, 2015 10:23
Show Gist options
  • Save Znack/63e0be05e639e2e25499 to your computer and use it in GitHub Desktop.
Save Znack/63e0be05e639e2e25499 to your computer and use it in GitHub Desktop.
from django.core.urlresolvers import reverse
from django.utils.text import mark_safe
def add_link_field_to_related(target_model=None, field='', app='', field_name='link',
link_text=unicode):
def add_link(cls):
reverse_name = target_model or cls.model.__name__.lower()
def link(self, instance):
app_name = app or instance._meta.app_label
reverse_path = "admin:%s_%s_change" % (app_name, reverse_name)
link_obj = getattr(instance, field, None) or instance
url = reverse(reverse_path, args = (link_obj.id,))
return mark_safe("<a href='%s'>%s</a>" % (url, link_text(link_obj)))
link.allow_tags = True
link.short_description = reverse_name + ' link'
setattr(cls, field_name, link)
cls.readonly_fields = list(getattr(cls, 'readonly_fields', [])) + \
[field_name]
return cls
return add_link
def add_link_field_to_create_related(
target_model=None,
reverse_field='',
app='',
link_text=None,
field_name='link',
short_description=None
):
def add_link(cls):
reverse_name = target_model or cls.model.__name__.lower()
def link(self, instance):
app_name = app or instance._meta.app_label
reverse_path = "admin:%s_%s_add" % (app_name, reverse_name)
url = reverse(reverse_path)
link_text_to_display = link_text or "Add %s to %s" % (reverse_name, instance)
return mark_safe("<a href='%s?%s=%s'>%s</a>" % (url, reverse_field, instance.id, link_text_to_display))
link.allow_tags = True
link.short_description = short_description or 'Add %s link' % reverse_name
setattr(cls, field_name, link)
cls.readonly_fields = tuple(getattr(cls, 'readonly_fields', tuple())) + (field_name,)
return cls
return add_link
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment