如何在模型的django管理站点实例的url中设置上下文?
我在django站点上有一个管理站点实例和以下模型如何在模型的django管理站点实例的url中设置上下文?,django,django-models,django-admin,Django,Django Models,Django Admin,我在django站点上有一个管理站点实例和以下模型 class Board(models.Model): slug = models.SlugField(verbose_name = _('Slug')) name = models.CharField(max_length=200, verbose_name = _('Name')) class Category(models.Model): board = models.ForeignKey(Board) s
class Board(models.Model):
slug = models.SlugField(verbose_name = _('Slug'))
name = models.CharField(max_length=200, verbose_name = _('Name'))
class Category(models.Model):
board = models.ForeignKey(Board)
slug = models.SlugField(verbose_name = _('Slug'))
name = models.CharField(max_length=200, verbose_name = _('Name'))
class Message(models.Model):
board = models.ForeignKey(Board)
category = models.ForeignKey(Category)
name = models.CharField(max_length=200, verbose_name = _('Name'))
我如何设置一些董事会作为管理网站的上下文?所以,在消息列表中,只有来自该板的消息,在编辑某些消息时,是否可以仅从该板中选择类别
我尝试在url中添加一些参数,并覆盖modeladmin queryset,如下所示:
url(r'^manage-board/(?P<board_slug>[-\w]+)', include(board_admin.urls)),
class MessageAdmin(PinAdmin):
def queryset(self, request):
board_slug = resolve(request.path).args.get('board_slug')
if board_slug:
return Pin.objects.filter(board__slug = board_slug)
else:
return None
url(r'^manageboard/(?P[-\w]+),包括(board_admin.url)),
类MessageAdmin(PinAdmin):
def查询集(自我,请求):
board\u slug=resolve(request.path).args.get('board\u slug'))
如果板_段塞:
返回引脚.objects.filter(线路板\u段塞=线路板\u段塞)
其他:
一无所获
但不幸的是,这种方法不起作用,因为它捕获其他参数并显示错误。我通过覆盖自定义AdminSite中的admin_view方法修复了url中参数捕获的错误。但不幸的是,并没有办法修复反向url查找中的错误,因为管理员站点对param一无所知。经过一些调查之后,我找到了一种方法,可以使用额外的中间件类来解决这个问题。整体解决方案: url.py
url(r'^manage-board/', include(board_admin.urls)),
中间件.py
import re
r = re.compile(r'^/manage-board/(?P<board_slug>[-\w]+)/')
class AdminMiddleware(object):
def process_request(self, request):
match=r.search(request.path)
if match:
match = match.groupdict()
request.board_slug = match.get('board_slug')
request.path = request.path.replace('manage-board/'+ request.board_slug,'manage-board')
request.path_info = request.path_info.replace('manage-board/'+ request.board_slug,'manage-board')
def process_response(self, request, response):
if hasattr(request, 'board_slug'):
response.content = response.content.decode('utf-8').replace("/manage-board/", u"/manage-board/%s/" % request.board_slug).encode('utf-8')
return response
class BoardModelAdmin(admin.ModelAdmin):
exclude = ('board',)
def queryset(self, request):
qs = super(BoardModelAdmin, self).queryset(request)
if hasattr(request, 'board_slug'):
return qs.filter(board__slug = request.board_slug)
else:
return qs
def save_model(self, request, obj, form, change):
if hasattr(request, 'board_slug'):
obj.board = Baord.objects.get(slug = request.board_slug)
super(BoardModelAdmin, self).save_model(request, obj, form, change)
def formfield_for_foreignkey(self, db_field, request, **kwargs):
if db_field.name == "category" and hasattr(request, 'board_slug'):
kwargs["queryset"] = Category.objects.filter(board__slug=request.board_slug)
return super(BoardModelAdmin, self).formfield_for_foreignkey(db_field, request, **kwargs)
class BoardRelatedFieldListFilter(RelatedFieldListFilter):
def __init__(self, field, request, params, model, model_admin, field_path):
super(BoardRelatedFieldListFilter, self).__init__(field, request, params, model, model_admin, field_path)
if hasattr(request, 'board_slug'):
self.lookup_choices = [(instance.pk, smart_unicode(instance)) for instance in field.rel.to.objects.filter(board__slug=request.board_slug)]
class MessageAdmin(BoardModelAdmin):
list_filter = [('category', BoardRelatedFieldListFilter)]