Python 在django中加载页面时执行的动态ChoiceFilter

Python 在django中加载页面时执行的动态ChoiceFilter,python,django,Python,Django,我正在使用并尝试创建一个自定义的、动态的选项列表,该列表还可以选择传递一个空白字符串来显示所有选项。my filters.py中的以下代码工作正常,但是该代码在web服务器启动时执行,而不是每次加载页面时执行。因此,如果有人添加工厂,除非重新启动web服务器,否则过滤器下拉选项中不会反映这一点。当页面加载时,如何进行此评估 来自my filters.py的代码 def createplantchoices(): PLANT_CHOICES= [['', 'Show All'],]

我正在使用并尝试创建一个自定义的、动态的选项列表,该列表还可以选择传递一个空白字符串来显示所有选项。my filters.py中的以下代码工作正常,但是该代码在web服务器启动时执行,而不是每次加载页面时执行。因此,如果有人添加工厂,除非重新启动web服务器,否则过滤器下拉选项中不会反映这一点。当页面加载时,如何进行此评估

来自my filters.py的代码

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))