1

高度な検索に使用するフォームがあります。フィールドの 1 つisland_groupは、クエリセットとして a を返す ModelChoiceField ですvalues_list(それぞれの個別の値を 1 回だけ取得するため)。

フォーム.py:

class SearchForm(forms.Form):
    ...
    island_group = forms.ModelChoiceField(
        required=False,
        queryset=Locality.objects.values_list('islandgroup', flat=True).distinct('islandgroup')
    ...

invalid choiceオブジェクトではなく値を使用しているため、次の行に沿ってエラーがスローされるため、エラーをオーバーライドします。

    def clean(self):
        cleaned_data = super(SearchForm, self).clean()

        if self._errors["island_group"]:
            del self._errors["island_group"]

        return cleaned_data

ただし、KeyError at /collections/ 'island_group'エラーが発生し続けます。実際、このデータは読み取り専用データベースから取得されているため、最小限の手間でビューに渡すことができるようにしたいだけです。

どんな助けでも大歓迎です。また、トレースバックは次のとおりです。

Traceback:
File "/home/sam/django-projects/datazone/local/lib/python2.7/site-packages/django/core/handlers/base.py" in get_response
  111.                         response = callback(request, *callback_args, **callback_kwargs)
File "/home/sam/django-projects/datazone/bin/datazone/cdrs/views.py" in cdrs_index
  59.     return render(request, 'cdrs_index.html', context)    
File "/home/sam/django-projects/datazone/local/lib/python2.7/site-packages/django/shortcuts/__init__.py" in render
  44.     return HttpResponse(loader.render_to_string(*args, **kwargs),
File "/home/sam/django-projects/datazone/local/lib/python2.7/site-packages/django/template/loader.py" in render_to_string
  188.         return t.render(context_instance)
File "/home/sam/django-projects/datazone/local/lib/python2.7/site-packages/django/template/base.py" in render
  123.             return self._render(context)
File "/home/sam/django-projects/datazone/local/lib/python2.7/site-packages/django/test/utils.py" in instrumented_test_render
  57.     return self.nodelist.render(context)
File "/home/sam/django-projects/datazone/local/lib/python2.7/site-packages/django/template/base.py" in render
  744.                 bits.append(self.render_node(node, context))
File "/home/sam/django-projects/datazone/local/lib/python2.7/site-packages/django/template/base.py" in render_node
  757.         return node.render(context)
File "/home/sam/django-projects/datazone/local/lib/python2.7/site-packages/django/template/loader_tags.py" in render
  127.         return compiled_parent._render(context)
File "/home/sam/django-projects/datazone/local/lib/python2.7/site-packages/django/test/utils.py" in instrumented_test_render
  57.     return self.nodelist.render(context)
File "/home/sam/django-projects/datazone/local/lib/python2.7/site-packages/django/template/base.py" in render
  744.                 bits.append(self.render_node(node, context))
File "/home/sam/django-projects/datazone/local/lib/python2.7/site-packages/django/template/base.py" in render_node
  757.         return node.render(context)
File "/home/sam/django-projects/datazone/local/lib/python2.7/site-packages/django/template/loader_tags.py" in render
  64.             result = block.nodelist.render(context)
File "/home/sam/django-projects/datazone/local/lib/python2.7/site-packages/django/template/base.py" in render
  744.                 bits.append(self.render_node(node, context))
File "/home/sam/django-projects/datazone/local/lib/python2.7/site-packages/django/template/base.py" in render_node
  757.         return node.render(context)
File "/home/sam/django-projects/datazone/local/lib/python2.7/site-packages/django/template/defaulttags.py" in render
  227.                 nodelist.append(node.render(context))
File "/home/sam/django-projects/datazone/local/lib/python2.7/site-packages/django/template/base.py" in render
  792.             output = self.filter_expression.resolve(context)
File "/home/sam/django-projects/datazone/local/lib/python2.7/site-packages/django/template/base.py" in resolve
  510.                 obj = self.var.resolve(context)
File "/home/sam/django-projects/datazone/local/lib/python2.7/site-packages/django/template/base.py" in resolve
  653.             value = self._resolve_lookup(context)
File "/home/sam/django-projects/datazone/local/lib/python2.7/site-packages/django/template/base.py" in _resolve_lookup
  683.                         current = getattr(current, bit)
File "/home/sam/django-projects/datazone/local/lib/python2.7/site-packages/django/forms/forms.py" in _errors
  415.         return self.form.errors.get(self.name, self.form.error_class())
File "/home/sam/django-projects/datazone/local/lib/python2.7/site-packages/django/forms/forms.py" in _get_errors
  112.             self.full_clean()
File "/home/sam/django-projects/datazone/local/lib/python2.7/site-packages/django/forms/forms.py" in full_clean
  268.         self._clean_form()
File "/home/sam/django-projects/datazone/local/lib/python2.7/site-packages/django/forms/forms.py" in _clean_form
  296.             self.cleaned_data = self.clean()
File "/home/sam/django-projects/datazone/bin/datazone/cdrs/forms.py" in clean
  113.         if self._errors["island_group"]:

Exception Type: KeyError at /collections/
Exception Value: 'island_group'
4

1 に答える 1

0

アップデート

私はあなたの例外を知っていると思います、それはSelect a valid choice. That choice is not one of the available choices.正しいように見えるかもしれませんか?その理由は、Locality.objects.values_list('islandgroup', flat=True).distinct('islandgroup')に渡したものqueryset=ValuesListQuerySetの代わりであるためですQuerySetValueListQuerySetインスタンスには情報が含まれておらず、_meta通常のリストとして使用されます。これによりModelChoiceField、誤ったフォームオプションが生成されます。以下の不自然な例のように

>>> from django import forms
>>> from django.contrib.auth.models import *

>>> class F(forms.Form):
...     user = forms.ModelChoiceForm(queryset=User.objects.values_list('username', flat=True))

>>> print F().as_p()
<p><label for="id_user">User:</label> <select name="user" id="id_user">
<option value="" selected="selected">---------</option>
<option value="okm">okm</option>
</select></p>

ただし、2番目のオプションの正しい値は、次のようpkにユーザーokmである必要があります。

>>> class F(forms.Form):
...     user = forms.ModelChoiceForm(queryset=User.objects)

>>> print F().as_p()
<p><label for="id_user">User:</label> <select name="user" id="id_user">
<option value="" selected="selected">---------</option>
<option value="1">okm</option>
</select></p>

したがって、モデルフィールドisland_group =のタイプに応じて、コードの行を変更する必要があります。islandgroup

上記の問題を除いて、コードは問題ありません。したがって、に他の'island_group'検証エラーがない場合self._errorsself._errors["island_group"]KeyErrorが発生します。

于 2012-04-20T14:54:39.657 に答える