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