1

カスタムウィジェットを作成しました

class AutoCompleteWidget(widgets.TextInput):
"""
widget to show an autocomplete box which returns a list on nodes available to be tagged
"""
def render(self, name, value, attrs=None):
    final_attrs = self.build_attrs(attrs, name=name)

    if not self.attrs.has_key('id'):
        final_attrs['id'] = 'id_%s' % name

    if not value: value = '[]'

    jquery = u"""
    <script type="text/javascript">
    $("#%s").tokenInput('%s', {
        hintText: "Enter the word",
        noResultsText: "No results",
        prePopulate: %s,
        searchingText: "Searching..."
    });

    $("body").focus();
    </script>
    """ % (final_attrs['id'], reverse('ajax_autocomplete'), value)

    output = super(AutoTagWidget, self).render(name, "", attrs)

    return output + mark_safe(jquery)

class MyForm(forms.Form):
    AutoComplete = forms.CharField(widget=AutoCompleteWidget)

このウィジェットは、データベースのエントリに基づいて単語をオートコンプリートするjquery関数を使用します。prePopulateをフォームのjson文字列に設定することで、初期値を事前設定できます

['name': 'some name', 'id': 'some id']

これを行うには、フォームフィールドの初期値をこのjson文字列に設定します

jquery_string = ['name': 'some name', 'id': 'some id']
form = MyForm(initial={'AutoComplete':jquery_string})

フォームを送信すると、オートコンプリートの値が、選択したIDのコンマ区切りのリストとして返されます(例:12,45,43,66)。

ただし、フォームにエラーがある場合、たとえば、必須フィールドが入力されていない場合、オートコンプリートフィールドの値は12,45,43,66になり、必要なjson文字列ではなくなります。

これを解決するための最良の方法は何ですか。フォームクラスのcleanメソッドを上書きすることを考えていましたが、他の要素がエラーを返したかどうかを確認する方法がわかりません。例えば

if forms.errors
   form.cleaned_date['autocomplete'] = json string

return form.cleaned_data

ありがとう

4

1 に答える 1

0

では、適切なフィールド クリーン メソッドでクリーンを実行できないのはなぜですか。

カスタム ウィジェットを使用してオートコンプリート フィールドを生成する場合も、同じ手法を使用します。ユーザーがウィジェットからいくつかの結果を選択すると、私のjsコードは隠された「id」フィールドに正しいIDを入力し、このフィールドのクリーンメソッドを持っています:

 def clean_category(self):
        try:
            category = Category.objects.get(id=int(self.cleaned_data['category']))
        except:
            raise forms.ValidationError("Such category doesn't exist")
        return category
于 2010-03-21T23:52:36.070 に答える