首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Django到模型编辑的内联链接

Django到模型编辑的内联链接
EN

Stack Overflow用户
提问于 2014-08-04 13:46:59
回答 2查看 5.9K关注 0票数 7

我知道这个问题已经被问过不止一次了,但是由于Django正在开发新的版本,我将再次问这个问题:

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

models.py

代码语言:javascript
复制
class Plan(models.Model):
    user = models.ForeignKey(User)

通过在Plan中这样做,我可以简单地显示用户中的每个admin.py

代码语言:javascript
复制
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的外键的模型:

代码语言:javascript
复制
class Order(models.Model):
    plan = models.ForeignKey('Plan')

我希望能够看到每个Plan的所有Plan。到目前为止,不可能在Django管理中嵌套行内嵌(如果不编辑HTML,我想避免):

代码语言:javascript
复制
User 
     -> Plan 1 
              -> Order 1
              -> Order 2

     -> Plan 2
              -> Order 3

因此,我的想法是在User Admin only A链接中显示每个计划,到页面编辑Plans,并将Orders作为内联:

代码语言:javascript
复制
class OrderInline(admin.TabularInline):
    model = Order
    extra = 0

class PlanAdmin(admin.ModelAdmin):
    inlines = [OrderInline,]

admin.site.register(Plan, PlanAdmin)

问题是,如何在用户管理中显示到计划的链接?

代码语言:javascript
复制
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中添加类似的内容:

代码语言:javascript
复制
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]

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

有没有办法干净利落地这样做?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-08-04 15:47:25

我建议添加一个自定义PlanInline方法,返回链接并查看它是否有用。类似于这样的东西:

代码语言:javascript
复制
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中,如下所述:fields

change_link方法的几个注意事项:您需要用实际的应用程序名替换视图名称中的'myapp‘。mark_safe方法只是将文本标记为模板引擎将其呈现为html的安全。

票数 6
EN

Stack Overflow用户

发布于 2017-11-09 07:20:04

django 1.8的最新情况

代码语言:javascript
复制
show_change_link = True

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

票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25120208

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档