Django内联链接到模型编辑

时间:2014-08-04 13:47:00

标签: python django django-models django-admin

我知道这个问题不止一次被问过,但是随着Django的新版本不断发展,我再次提出这个问题:

我正在使用模型User(Django User,而不是我的models.py)并使用外键创建另一个模型用户。

models.py

class Plan(models.Model):
    user = models.ForeignKey(User)

我可以在Plan中执行此操作,在我的用户中显示每个admin.py

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')

我希望能够看到每个Orders的所有Plan。截至今天,在Django Admin中嵌套内联是不可能的(不编辑HTML,我想避免使用):

User 
     -> Plan 1 
              -> Order 1
              -> Order 2

     -> Plan 2
              -> Order 3

所以我的想法是在每个计划的User Admin A LINK 中显示到要编辑的页面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: Show partially an inline model and link to the complete model,但它们有点“肮脏”。因为它们使我们在代码中编写HTML和绝对路径。

然后我在Djangoproject上看到了这张票:https://code.djangoproject.com/ticket/13163。这看起来正是我正在寻找的,而且机票已经修好了#34;。所以我尝试在修复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]

但它不起作用(我没有日志或错误)。

有没有办法以干净的方式做到这一点?

2 个答案:

答案 0 :(得分:4)

我建议添加一个自定义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的安全。

答案 1 :(得分:2)

更新django 1.8

show_change_link = True

https://github.com/django/django/pull/2957/files