我有一个对象的标准管理员更改表单,通常的StackedInline表单用于ForeignKey关系。我希望能够将每个内联项链接到相应的完整大小的更改表单,因为内联项具有自己的内联项,我无法嵌套它们。
我已尝试过从自定义小部件到自定义模板的所有内容,并且无法使任何内容正常运行。到目前为止,我以片段形式看到的“解决方案”似乎并不适用于内联。我正准备尝试使用jQuery进行一些DOM攻击,以使其正常工作并继续前进。
我希望我必须错过一些非常简单的事情,因为这看起来像是一项简单的任务!
使用Django 1.2。
答案 0 :(得分:75)
自Django 1.8以来,有一个名为show_change_link
的属性。
答案 1 :(得分:44)
我在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',)
答案 2 :(得分:11)
我有类似的问题,我想出了自定义小部件,并对模型形式进行了一些调整。这是小部件:
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'')
现在,因为每个内联的widget需要在构造函数中获得不同的对象,所以不能只以标准方式设置它,而是在Form的 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)
我希望有所帮助。
答案 3 :(得分:9)
目前公认的解决方案是好的工作,但它已经过时了。
自Django 1.3以来,有一个名为show_change_link = True
的内置属性可以解决这个问题。
这可以添加到任何StackedInline或TabularInline对象。例如:
class ContactListInline(admin.TabularInline):
model = ContactList
fields = ('name', 'description', 'total_contacts',)
readonly_fields = ('name', 'description', 'total_contacts',)
show_change_link = True
结果将是这样的:
答案 4 :(得分:2)
Quentin的上述答案有效,但您还需要指定字段=(&#39; admin_link&#39;,)
答案 5 :(得分:2)
有一个用于此目的的模块。查看: django-relatives
答案 6 :(得分:0)
我认为:args = [instance.id]应该是args = [instance.pk]。它对我有用!