
我正在使用模型User(Django User,而不是我的models.py)并使用Foreign键创建另一个模型到User.
models.py:
class Plan(models.Model):
user = models.ForeignKey(User)
我可以通过在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')
我希望能够查看每个计划的所有订单.截至今天,在Django Admin中嵌套内联是不可能的(不编辑HTML,我想避免):
User
-> Plan 1
-> Order 1
-> Order 2
-> Plan 2
-> Order 3
所以我的想法是在用户管理中仅显示每个计划的链接,显示计划的页面,并将订单显示为内联:
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.这看起来正是我正在寻找的,并且票是“固定的”.所以我尝试在修复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]
但它不起作用(我没有日志或错误).
有没有办法以干净的方式做到这一点?
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是安全的.
转载注明原文:python – Django内联链接到模型编辑 - 乐贴网