Python 在django中加载页面时执行的动态ChoiceFilter
我正在使用并尝试创建一个自定义的、动态的选项列表,该列表还可以选择传递一个空白字符串来显示所有选项。my filters.py中的以下代码工作正常,但是该代码在web服务器启动时执行,而不是每次加载页面时执行。因此,如果有人添加工厂,除非重新启动web服务器,否则过滤器下拉选项中不会反映这一点。当页面加载时,如何进行此评估 来自my filters.py的代码Python 在django中加载页面时执行的动态ChoiceFilter,python,django,Python,Django,我正在使用并尝试创建一个自定义的、动态的选项列表,该列表还可以选择传递一个空白字符串来显示所有选项。my filters.py中的以下代码工作正常,但是该代码在web服务器启动时执行,而不是每次加载页面时执行。因此,如果有人添加工厂,除非重新启动web服务器,否则过滤器下拉选项中不会反映这一点。当页面加载时,如何进行此评估 来自my filters.py的代码 def createplantchoices(): PLANT_CHOICES= [['', 'Show All'],]
def createplantchoices():
PLANT_CHOICES= [['', 'Show All'],]
plant_list = Plant.objects.all().order_by('manufacturer')
for plant in plant_list:
PLANT_CHOICES.append([plant.id , plant.plant_number + " - " + plant.manufacturer],)
return PLANT_CHOICES
class SightingFilter(django_filters.FilterSet):
plant_number = django_filters.ChoiceFilter(choices=createplantchoices())
state = django_filters.ChoiceFilter(choices=STATE_CHOICES)
class Meta:
model = Sighting
fields = ['city', 'store', 'brand', 'product', 'flavor', 'fat', 'size']
2015年2月28日编辑
如果我像这样将代码放在init中:
然后,当页面按我所希望的方式加载时,对下拉列表进行评估。然而,现在当我尝试应用过滤器时,我得到的错误是无法将关键字u'None'解析到字段中。选择是:然后列出我的模型中的所有字段。我的原始代码没有发生此错误
完全错误:
Environment:
Request Method: GET
Request URL: http://dev.mysite.org/?city=&store=&brand=&product=&flavor=&fat=&size=&state=&plant_number=3
Django Version: 1.7.1
Python Version: 2.7.5
Installed Applications:
('django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'django.contrib.humanize',
'axes',
'imagekit',
'yogurt')
Installed Middleware:
('django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
'axes.middleware.FailedLoginMiddleware',
'comp.middleware.LoginRequiredMiddleware')
Template error:
In template /srv/www/mysite/templates/dashboard.html, error at line 7
Cannot resolve keyword u'None' into field. Choices are: plant_number, plant_number_id, brand, city, date, fat, flavor, id, photo, price, product, size, slug, state, store
1 : {% extends "base.html" %}
2 : {% load humanize %}
3 : {% block content %}
4 : <form action="" method="get">
5 : <div id="fil" style="clear:both;">
6 : <p><b>Filters</b></p>
7 : {{ filter.form.as_ul }}
8 : </div>
9 : <div style="clear:both; margin-left:30px";>
10 : <input type="submit" value="Filter Results"/>
11 : <input type="submit" name="Clear Filters" value="Clear Filters" />
12 : </div>
13 : </form>
14 : <div id="indent">
15 : {% for obj in filter %}
16 : <a href="/sighting/{{ obj.slug }}/ ">{{ obj.date|date:"m/d/Y" }} {{ obj.brand }} ${{ obj.price|intcomma }} </a><br />
17 : {% endfor %}
Traceback:
File "/opt/comp/lib/python2.7/site-packages/django/core/handlers/base.py" in get_response
111. response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "./yogurt/views.py" in dashboard
20. return render_to_response('dashboard.html', context, context_instance=RequestContext(request))
File "/opt/comp/lib/python2.7/site-packages/django/shortcuts.py" in render_to_response
23. return HttpResponse(loader.render_to_string(*args, **kwargs), **httpresponse_kwargs)
File "/opt/comp/lib/python2.7/site-packages/django/template/loader.py" in render_to_string
178. return t.render(context_instance)
File "/opt/comp/lib/python2.7/site-packages/django/template/base.py" in render
148. return self._render(context)
File "/opt/comp/lib/python2.7/site-packages/django/template/base.py" in _render
142. return self.nodelist.render(context)
File "/opt/comp/lib/python2.7/site-packages/django/template/base.py" in render
844. bit = self.render_node(node, context)
File "/opt/comp/lib/python2.7/site-packages/django/template/debug.py" in render_node
80. return node.render(context)
File "/opt/comp/lib/python2.7/site-packages/django/template/loader_tags.py" in render
126. return compiled_parent._render(context)
File "/opt/comp/lib/python2.7/site-packages/django/template/base.py" in _render
142. return self.nodelist.render(context)
File "/opt/comp/lib/python2.7/site-packages/django/template/base.py" in render
844. bit = self.render_node(node, context)
File "/opt/comp/lib/python2.7/site-packages/django/template/debug.py" in render_node
80. return node.render(context)
File "/opt/comp/lib/python2.7/site-packages/django/template/loader_tags.py" in render
65. result = block.nodelist.render(context)
File "/opt/comp/lib/python2.7/site-packages/django/template/base.py" in render
844. bit = self.render_node(node, context)
File "/opt/comp/lib/python2.7/site-packages/django/template/debug.py" in render_node
80. return node.render(context)
File "/opt/comp/lib/python2.7/site-packages/django/template/debug.py" in render
90. output = self.filter_expression.resolve(context)
File "/opt/comp/lib/python2.7/site-packages/django/template/base.py" in resolve
596. obj = self.var.resolve(context)
File "/opt/comp/lib/python2.7/site-packages/django/template/base.py" in resolve
734. value = self._resolve_lookup(context)
File "/opt/comp/lib/python2.7/site-packages/django/template/base.py" in _resolve_lookup
764. current = current[bit]
File "/opt/comp/lib/python2.7/site-packages/django_filters/filterset.py" in __getitem__
293. return self.qs[key]
File "/opt/comp/lib/python2.7/site-packages/django_filters/filterset.py" in qs
324. qs = filter_.filter(qs, value)
File "/opt/comp/lib/python2.7/site-packages/django_filters/filters.py" in filter
78. qs = method(**{'%s__%s' % (self.name, lookup): value})
File "/opt/comp/lib/python2.7/site-packages/django/db/models/query.py" in filter
691. return self._filter_or_exclude(False, *args, **kwargs)
File "/opt/comp/lib/python2.7/site-packages/django/db/models/query.py" in _filter_or_exclude
709. clone.query.add_q(Q(*args, **kwargs))
File "/opt/comp/lib/python2.7/site-packages/django/db/models/sql/query.py" in add_q
1287. clause, require_inner = self._add_q(where_part, self.used_aliases)
File "/opt/comp/lib/python2.7/site-packages/django/db/models/sql/query.py" in _add_q
1314. current_negated=current_negated, connector=connector)
File "/opt/comp/lib/python2.7/site-packages/django/db/models/sql/query.py" in build_filter
1138. lookups, parts, reffed_aggregate = self.solve_lookup_type(arg)
File "/opt/comp/lib/python2.7/site-packages/django/db/models/sql/query.py" in solve_lookup_type
1076. _, field, _, lookup_parts = self.names_to_path(lookup_splitted, self.get_meta())
File "/opt/comp/lib/python2.7/site-packages/django/db/models/sql/query.py" in names_to_path
1383. self.raise_field_error(opts, name)
File "/opt/comp/lib/python2.7/site-packages/django/db/models/sql/query.py" in raise_field_error
1389. "Choices are: %s" % (name, ", ".join(available)))
Exception Type: FieldError at /
Exception Value: Cannot resolve keyword u'None' into field. Choices are: plant_number, plant_number_id, brand, city, date, fat, flavor, id, photo, price, product, size, slug, state, store
您需要在表单而不是模型中执行此操作。这不在models.py中,而是在filter.py中。user forms.pyok不够公平,但同样的原则适用于。。。“视觉过滤器”类似于带有选择字段的模型。。。您需要将您的选择逻辑移到filter类的_init__;方法中,而不是在import timeAnentropic中执行的代码,请参见上面的编辑。将代码放入init会导致它在页面加载时像我所希望的那样进行更新,但现在会导致其他问题。好吧,可能会发布stacktrace,或者甚至查看一下它,找出哪里出了问题
Environment:
Request Method: GET
Request URL: http://dev.mysite.org/?city=&store=&brand=&product=&flavor=&fat=&size=&state=&plant_number=3
Django Version: 1.7.1
Python Version: 2.7.5
Installed Applications:
('django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'django.contrib.humanize',
'axes',
'imagekit',
'yogurt')
Installed Middleware:
('django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
'axes.middleware.FailedLoginMiddleware',
'comp.middleware.LoginRequiredMiddleware')
Template error:
In template /srv/www/mysite/templates/dashboard.html, error at line 7
Cannot resolve keyword u'None' into field. Choices are: plant_number, plant_number_id, brand, city, date, fat, flavor, id, photo, price, product, size, slug, state, store
1 : {% extends "base.html" %}
2 : {% load humanize %}
3 : {% block content %}
4 : <form action="" method="get">
5 : <div id="fil" style="clear:both;">
6 : <p><b>Filters</b></p>
7 : {{ filter.form.as_ul }}
8 : </div>
9 : <div style="clear:both; margin-left:30px";>
10 : <input type="submit" value="Filter Results"/>
11 : <input type="submit" name="Clear Filters" value="Clear Filters" />
12 : </div>
13 : </form>
14 : <div id="indent">
15 : {% for obj in filter %}
16 : <a href="/sighting/{{ obj.slug }}/ ">{{ obj.date|date:"m/d/Y" }} {{ obj.brand }} ${{ obj.price|intcomma }} </a><br />
17 : {% endfor %}
Traceback:
File "/opt/comp/lib/python2.7/site-packages/django/core/handlers/base.py" in get_response
111. response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "./yogurt/views.py" in dashboard
20. return render_to_response('dashboard.html', context, context_instance=RequestContext(request))
File "/opt/comp/lib/python2.7/site-packages/django/shortcuts.py" in render_to_response
23. return HttpResponse(loader.render_to_string(*args, **kwargs), **httpresponse_kwargs)
File "/opt/comp/lib/python2.7/site-packages/django/template/loader.py" in render_to_string
178. return t.render(context_instance)
File "/opt/comp/lib/python2.7/site-packages/django/template/base.py" in render
148. return self._render(context)
File "/opt/comp/lib/python2.7/site-packages/django/template/base.py" in _render
142. return self.nodelist.render(context)
File "/opt/comp/lib/python2.7/site-packages/django/template/base.py" in render
844. bit = self.render_node(node, context)
File "/opt/comp/lib/python2.7/site-packages/django/template/debug.py" in render_node
80. return node.render(context)
File "/opt/comp/lib/python2.7/site-packages/django/template/loader_tags.py" in render
126. return compiled_parent._render(context)
File "/opt/comp/lib/python2.7/site-packages/django/template/base.py" in _render
142. return self.nodelist.render(context)
File "/opt/comp/lib/python2.7/site-packages/django/template/base.py" in render
844. bit = self.render_node(node, context)
File "/opt/comp/lib/python2.7/site-packages/django/template/debug.py" in render_node
80. return node.render(context)
File "/opt/comp/lib/python2.7/site-packages/django/template/loader_tags.py" in render
65. result = block.nodelist.render(context)
File "/opt/comp/lib/python2.7/site-packages/django/template/base.py" in render
844. bit = self.render_node(node, context)
File "/opt/comp/lib/python2.7/site-packages/django/template/debug.py" in render_node
80. return node.render(context)
File "/opt/comp/lib/python2.7/site-packages/django/template/debug.py" in render
90. output = self.filter_expression.resolve(context)
File "/opt/comp/lib/python2.7/site-packages/django/template/base.py" in resolve
596. obj = self.var.resolve(context)
File "/opt/comp/lib/python2.7/site-packages/django/template/base.py" in resolve
734. value = self._resolve_lookup(context)
File "/opt/comp/lib/python2.7/site-packages/django/template/base.py" in _resolve_lookup
764. current = current[bit]
File "/opt/comp/lib/python2.7/site-packages/django_filters/filterset.py" in __getitem__
293. return self.qs[key]
File "/opt/comp/lib/python2.7/site-packages/django_filters/filterset.py" in qs
324. qs = filter_.filter(qs, value)
File "/opt/comp/lib/python2.7/site-packages/django_filters/filters.py" in filter
78. qs = method(**{'%s__%s' % (self.name, lookup): value})
File "/opt/comp/lib/python2.7/site-packages/django/db/models/query.py" in filter
691. return self._filter_or_exclude(False, *args, **kwargs)
File "/opt/comp/lib/python2.7/site-packages/django/db/models/query.py" in _filter_or_exclude
709. clone.query.add_q(Q(*args, **kwargs))
File "/opt/comp/lib/python2.7/site-packages/django/db/models/sql/query.py" in add_q
1287. clause, require_inner = self._add_q(where_part, self.used_aliases)
File "/opt/comp/lib/python2.7/site-packages/django/db/models/sql/query.py" in _add_q
1314. current_negated=current_negated, connector=connector)
File "/opt/comp/lib/python2.7/site-packages/django/db/models/sql/query.py" in build_filter
1138. lookups, parts, reffed_aggregate = self.solve_lookup_type(arg)
File "/opt/comp/lib/python2.7/site-packages/django/db/models/sql/query.py" in solve_lookup_type
1076. _, field, _, lookup_parts = self.names_to_path(lookup_splitted, self.get_meta())
File "/opt/comp/lib/python2.7/site-packages/django/db/models/sql/query.py" in names_to_path
1383. self.raise_field_error(opts, name)
File "/opt/comp/lib/python2.7/site-packages/django/db/models/sql/query.py" in raise_field_error
1389. "Choices are: %s" % (name, ", ".join(available)))
Exception Type: FieldError at /
Exception Value: Cannot resolve keyword u'None' into field. Choices are: plant_number, plant_number_id, brand, city, date, fat, flavor, id, photo, price, product, size, slug, state, store
def dashboard(request):
if "Clear Filters" in request.GET:
return redirect('/')
else:
filter = SightingFilter(request.GET, queryset=Sighting.objects.all())
context = {'filter': filter, 'request': request}
return render_to_response('dashboard.html', context, context_instance=RequestContext(request))