Django内嵌链接到模型编辑
我知道这个问题已经被问过不止一次,但是随着Django正在发展新版本,我会再次提出这个问题:
我正在使用模型用户(Django用户,不在我的models.py中),并创建另一个模型与用户的外键。
models.py
:
class Plan(models.Model):
user = models.ForeignKey(User)
我可以通过在admin.py
执行此操作来简单地在我的用户中显示每个Plan
:
class PlanInline(admin.TabularInline):
model = Plan
extra = 0
class MyUserAdmin(UserAdmin):
ordering = ('-date_joined', 'username')
inlines = [PlanInline,]
admin.site.unregister(User)
admin.site.register(User, MyUserAdmin)
但事情将变得更加棘手。 我想添加一个外键指向Plan
:
class Order(models.Model):
plan = models.ForeignKey('Plan')
我希望能够看到每个Plan
所有Orders
。 截至今天,在Django Admin中嵌套内联是不可能的(不需要编辑我想要避免的HTML):
User
-> Plan 1
-> Order 1
-> Order 2
-> Plan 2
-> Order 3
所以我的想法是在每个计划的User Admin
只显示一个链接 ,在页面上显示编辑Plans
,并将Orders
作为内联:
class OrderInline(admin.TabularInline):
model = Order
extra = 0
class PlanAdmin(admin.ModelAdmin):
inlines = [OrderInline,]
admin.site.register(Plan, PlanAdmin)
问题是,如何在我的用户管理中显示指向计划的链接?
class MyUserAdmin(UserAdmin):
ordering = ('-date_joined', 'username')
??? LINK ????
我在这个主题上看到了一些解决方案:Django InlineModelAdmin:部分显示内联模型并链接到完整模型,但它们有点“脏”,因为它们让我们在代码中编写HTML和绝对路径。
然后我在Djangoproject上看到这张票:https://code.djangoproject.com/ticket/13163。 这看起来正是我要找的东西,而票据是“固定的”。 所以我试着在修正show_change_link = True
:
class PlanInline(admin.TabularInline):
model = Plan
extra = 0
show_change_link = True
class MyUserAdmin(UserAdmin):
ordering = ('-date_joined', 'username')
show_change_link = True
inlines = [UserProfileInline, PlanInline]
但它不起作用(我没有日志或错误)。
有没有办法以一种干净的方式做到这一点?
我建议添加一个自定义的PlanInline
方法,返回链接并查看是否有帮助。 沿着这些线路的东西:
from django.utils.safestring import mark_safe
from django.core.urlresolvers import reverse
class PlanInline(TabularInline):
model = Plan
readonly_fields = ('change_link',)
...other options here...
def change_link(self, obj):
return mark_safe('<a href="%s">Full edit</a>' %
reverse('admin:myapp_plan_change',
args=(obj.id,)))
基本上我们在这里所做的是创建自定义方法,该方法返回更改页面的链接(此特定实现未经测试,如果存在任何解析错误,则表示抱歉,但您明白了)然后将其添加到readonly_fields,如下所述: https://docs.djangoproject.com/en/dev/ref/contrib/admin/#django.contrib.admin.ModelAdmin.readonly_fields
几个关于change_link
方法的注释:您需要将视图名称中的'myapp'替换为您的实际应用程序名称。 mark_safe
方法只是将文本标记为模板引擎将其呈现为html的安全文本。
更新django 1.8
show_change_link = True
https://github.com/django/django/pull/2957/files
链接地址: http://www.djcxy.com/p/65429.html上一篇: Django inline link to model editing
下一篇: How to create django admin inlines for multiple types of questions?