Подтвердить что ты не робот

Добавление ссылок на полные формы изменений для встроенных элементов в django admin?

У меня есть стандартная форма изменения администратора для объекта, с обычными формами StackedInline для отношений ForeignKey. Я хотел бы иметь возможность связать каждый встроенный элемент с его соответствующей полноразмерной формой изменения, поскольку встроенный элемент имеет встроенные элементы, и я не могу их вложить.

Я пробовал все от пользовательских виджетов до пользовательских шаблонов и не могу заставить ничего работать. До сих пор "решения", которые я видел в виде простых фрагментов, похоже, не работают для строк. Я готов попробовать некоторые взлома DOM с помощью jQuery, чтобы заставить его работать и двигаться дальше.

Надеюсь, я должен пропустить что-то очень простое, так как это кажется такой простой задачей!

Использование Django 1.2.

4b9b3361

Ответ 1

У меня была аналогичная проблема, и я придумал пользовательский виджет плюс некоторые настройки для формы модели. Вот виджет:

from django.utils.safestring import  mark_safe    

class ModelLinkWidget(forms.Widget):
    def __init__(self, obj, attrs=None):
        self.object = obj
        super(ModelLinkWidget, self).__init__(attrs)

    def render(self, name, value, attrs=None):
        if self.object.pk:
            return mark_safe(
                u'<a target="_blank" href="../../../%s/%s/%s/">%s</a>' %\
                      (
                       self.object._meta.app_label,
                       self.object._meta.object_name.lower(),
                       self.object.pk, self.object
                       )
            )
        else:
            return mark_safe(u'')

Теперь, поскольку виджет для каждой строки должен получить другой объект в конструкторе, вы не можете просто установить его стандартным способом, но в форме init:

class TheForm(forms.ModelForm):
    ...
    # required=False is essential cause we don't
    # render input tag so there will be no value submitted.
    link = forms.CharField(label='link', required=False)

    def __init__(self, *args, **kwargs):
        super(TheForm, self).__init__(*args, **kwargs)
        # instance is always available, it just does or doesn't have pk.
        self.fields['link'].widget = ModelLinkWidget(self.instance)

Я надеюсь, что это поможет.

Ответ 2

В моем admin.py я сделал что-то вроде следующего:

from django.utils.html import format_html
from django.core.urlresolvers import reverse

class MyModelInline(admin.TabularInline):
    model = MyModel

    def admin_link(self, instance):
        url = reverse('admin:%s_%s_change' % (instance._meta.app_label,  
                                              instance._meta.module_name),
                      args=(instance.id,))
        return format_html(u'<a href="{}">Edit</a>', url)
        # … or if you want to include other fields:
        return format_html(u'<a href="{}">Edit: {}</a>', url, instance.title)

    readonly_fields = ('admin_link',)

Ответ 3

С Django 1.8 есть свойство, называемое show_change_link.

Ответ 4

Ответ Quentin выше работает, но вам также нужно указать поля = ('admin_link',)

Ответ 5

Я думаю: args = [instance.id] должен быть args = [instance.pk]. Это сработало для меня!