如何在模型的django管理站点实例的url中设置上下文?

如何在模型的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

我在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)
    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)]