Django admin:通过URL传递变量

时间:2010-08-16 20:29:52

标签: django django-admin

我想通过URL将变量传递给django admin中的另一个页面。 它似乎不起作用,我想传递变量“/?name = hello”,并通过request.GET.get [“name”,“”]捕获它。但是url变为“/?e = 1”过了之后。 如果我使用默认参数'q',它可以工作,但它会有冲突。 看来这个问题只是django-admin。我需要通过网址传递它而不是发布... 有谁知道如何解决这个问题

感谢

3 个答案:

答案 0 :(得分:9)

问题是当name尝试将其解析为模型字段时,查找get_query_set不存在。因此引发IncorrectLookupParameters()异常,然后重定向到不太有用的“e = 1”url。这个问题在Django 1.4中通过引入自定义filterspecs来解决。在此之前,一种可能的解决方案是动态覆盖ChangeList ModelAdmins方法返回的get_changelist()类。

此解决方案适用于Django 1.3:

class MyModelAdmin(ModelAdmin):

    def get_changelist(self, request, **kwargs):
        changelist_class = super(MyModelAdmin, self).get_changelist(request, 
                                                                 **kwargs)

        class CustomChangeList(changelist_class):
            def __init__(self, request, *args, **kwargs):
                self._name = request.GET.get('name')
                super(CustomChangeList, self).__init__(request, *args, **kwargs)

            def get_query_set(self, *args, **kwargs):
                if self._name:
                    del self.params['name']

                qs = super(CustomChangeList, self).get_query_set(*args, **kwargs)

                if self._name:
                    return qs.filter([FILTER WHAT YOU WANT HERE...])

                return qs


        return CustomChangeList

答案 1 :(得分:1)

你能解释一下你的问题吗......你为什么要把变量传递给django admin ... 你也不能像这样抓住GET变量...... 使用:

request.GET['name'] 

request.GET.get('name','')

.get是一个实例方法而不是字典。

答案 2 :(得分:0)

问题似乎仍未得到解答,与 another question 类似。 meesterguyperson 发布在那里a great answer,去看看。

解决方案是创建一个“假过滤器”,它将向 django 注册一个 URL 参数,但不会影响查询集和管理站点的外观。

我自己修改了 meesterguyperson 的答案,而不是使用空白模板来隐藏“假过滤器”,我只是通过从 has_output 方法返回 False 将其从过滤器窗格中排除。

from django.contrib.admin.filters import SimpleListFilter

class KwargPassThroughFilter(SimpleListFilter):
title = ''

# hide from filter pane
def has_output(self):
    return False

# these two function below must be implemented for SimpleListFilter to work
# (any implementation that doesn't affect queryset is fine)
def lookups(self, request, model_admin):
    return (request.GET.get(self.parameter_name), ''),

def queryset(self, request, queryset):
    return queryset

现在,您可以子类化此过滤器并使用所需的参数名称覆盖 parameter_name,例如

class NameKwargPassThroughFilter(KwargPassThroughFilter):
    parameter_name = 'name'

并在 ModelAdmin 子类中追加注册过滤器

class SomethingAdmin(admin.ModelAdmin):
    ...

    list_filter = (
        ...,
        NameKwargPassThroughFilter,
        ...,
    )

    ...

此时,您可以随意使用URL中的param,并在SomethingAdmin页面的范围内访问它...

适用于 Django 3.0+