Dynamic ModelAdmins不能與管理員註冊模型的方式一起使用。 我建議在CategoryAdmin中創建子視圖。
from django.conf.urls import patterns, url
from django.contrib import admin
from django.contrib.admin.options import csrf_protect_m
from django.contrib.admin.util import unquote
from django.core.urlresolvers import reverse
from demo_project.demo.models import Category, Tag
class TagAdmin(admin.ModelAdmin):
# as long as the CategoryTagAdmin class has no custom change_list template
# there needs to be a default admin for Tags
pass
admin.site.register(Tag, TagAdmin)
class CategoryTagAdmin(admin.ModelAdmin):
""" A ModelAdmin invoked by a CategoryAdmin"""
read_only_fields = ('category',)
def __init__(self, model, admin_site, category_admin, category_id):
self.model = model
self.admin_site = admin_site
self.category_admin = category_admin
self.category_id = category_id
super(CategoryTagAdmin, self).__init__(model, admin_site)
def queryset(self, request):
return super(CategoryTagAdmin, self).queryset(request).filter(category=self.category_id)
class CategoryAdmin(admin.ModelAdmin):
list_display = ('name', 'tag_changelist_link')
def tag_changelist_link(self, obj):
info = self.model._meta.app_label, self.model._meta.module_name
return '<a href="%s" >Tags</a>' % reverse('admin:%s_%s_taglist' % info, args=(obj.id,))
tag_changelist_link.allow_tags = True
tag_changelist_link.short_description = 'Tags'
@csrf_protect_m
def tag_changelist(self, request, *args, **kwargs):
obj_id = unquote(args[0])
info = self.model._meta.app_label, self.model._meta.module_name
category = self.get_object(request, obj_id)
tag_admin = CategoryTagAdmin(Tag, self.admin_site, self, category_id=obj_id)
extra_context = {
'parent': {
'has_change_permission': self.has_change_permission(request, obj_id),
'opts': self.model._meta,
'object': category,
},
}
return tag_admin.changelist_view(request, extra_context)
def get_urls(self):
info = self.model._meta.app_label, self.model._meta.module_name
urls= patterns('',
url(r'^(.+)/tags/$', self.admin_site.admin_view(self.tag_changelist), name='%s_%s_taglist' % info)
)
return urls + super(CategoryAdmin, self).get_urls()
admin.site.register(Category, CategoryAdmin)
在變更列表與由tag_changelist_link
指向CategoryAdmin.tag_changelist
做一個鏈接一個額外的列類別的項目。此方法創建一個帶有一些額外值的CategoryTagAdmin實例並返回其changelist_view。
這樣您就可以在每個類別上過濾標籤更改列表。要修復tag_changelist視圖的麪包屑,您需要將CategoryTagAdmin.change_list_template設置爲自己的模板{% extends 'admin/change_list.html' %}
並覆蓋{% block breadcrumbs %}
。那就是你將需要extra_context的parent
變量來創建正確的url。
如果計劃實施tag_changeview
和tag_addview
方法,你需要確保在variouse管理模板提供的鏈接都指向正確的URL(例如調用帶有FORM_URL作爲放慢參數的change_view)。 在添加新標籤時,CategoryTagAdmin上的save_model方法可以設置默認類別。
def save_model(self, request, obj, form, change):
obj.category_id = self.category_id
super(CategoryTagAdmin, self).__init__(request, obj, form, change)
如果你仍然想堅持apache重新啓動aproach ...是的,你可以重新啓動Django。這取決於你如何部署實例。 在apache上,您可以觸摸將重新加載實例os.utime(path/to/wsgi.py
的wsgi文件。 使用uwsgi時,您可以使用uwsgi.reload()
。
可以檢查Rosetta源代碼,他們是如何重新啓動轉換保存(views.py)後的實例。
這是一些該死的奇妙代碼就在那裏。儘管它還不完美,但它肯定給我指出了正確的方向,並且您還指出瞭如何重新啓動服務器的選項。非常感謝你,你得到了賞金,你非常值得! – yuvi