Rap*_*ent 5 python django django-models django-admin
我知道这个问题已经被问过不止一次了,但是随着 Django 的新版本不断发展,我会再次问这个问题:
我正在使用模型用户(Django 用户,不在我的 models.py 中)并创建另一个带有用户外键的模型。
models.py :
class Plan(models.Model):
user = models.ForeignKey(User)
Run Code Online (Sandbox Code Playgroud)
我可以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)
Run Code Online (Sandbox Code Playgroud)
但事情即将变得更加棘手。我想添加一个外键指向的模型Plan:
class Order(models.Model):
plan = models.ForeignKey('Plan')
Run Code Online (Sandbox Code Playgroud)
我希望能够看到Orders每个Plan. 截至今天,在 Django Admin 中不可能嵌套内联(不编辑我想避免的 HTML):
User
-> Plan 1
-> Order 1
-> Order 2
-> Plan 2
-> Order 3
Run Code Online (Sandbox Code Playgroud)
所以我的想法是在每个计划的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)
Run Code Online (Sandbox Code Playgroud)
问题是,如何在我的用户管理中显示一个计划的链接?
class MyUserAdmin(UserAdmin):
ordering = ('-date_joined', 'username')
??? LINK ????
Run Code Online (Sandbox Code Playgroud)
我看到了一些关于这个主题的解决方案: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]
Run Code Online (Sandbox Code Playgroud)
但它不起作用(我没有日志或错误)。
有没有办法以干净的方式做到这一点?
小智 6
django 1.8 更新
show_change_link = True
Run Code Online (Sandbox Code Playgroud)
https://github.com/django/django/pull/2957/files
我建议添加一个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,)))
Run Code Online (Sandbox Code Playgroud)
基本上我们在这里所做的就是创建返回更改页面链接的自定义方法(此特定实现未经过测试,如果有任何解析错误,请抱歉,但您明白了),然后将其添加到 readonly_fields 中,如下所述:https://docs.djangoproject.com/en/dev/ref/contrib/admin/#django.contrib.admin.ModelAdmin.readonly_fields
该change_link方法的几个注意事项:您需要将视图名称中的“myapp”替换为您的实际应用程序名称。该mark_safe方法只是将文本标记为安全,模板引擎将其呈现为 html。
| 归档时间: |
|
| 查看次数: |
5030 次 |
| 最近记录: |