2

django-autocomplete-light を使用しようとしていますが、いくつか問題があります。でクエリセットをフィルタリングしたいと思いModelChoiceFieldます。オートコンプリートを使用しない場合、結果の選択は正しいのですが、ウィジェットを使用すると正しく機能せず、すべてのレコードが表示されます。

これが私のコードです:

class MyModelAdminForm(forms.ModelForm):
    def __init__(self, *args, **kw):
        super(MyModelAdminForm, self).__init__(*args, **kw)
        self.fields['my_field'] = forms.ModelChoiceField(
            MyModel.objects.filter(status=1),
            widget=autocomplete_light.ChoiceWidget('MyModelAutocomplete')
    )

class MyModelAdmin(ModelAdmin):
    form = MyModelAdminForm
4

3 に答える 3

3

MyModelAutocomplete.choices次のいずれかを介して設定する必要がありregister()ます。

autocomplete_light.register(MyModel, choices=MyModel.objects.filter(status=1))

またはクラス内で:

class MyModelAutocomplete(autocomplete_light.AutocompleteModelBase):
    choices = MyModel.objects.filter(status=1)

詳細については、ドキュメントを参照してください。

これを自動化したいのですが、ウィジェットは残念ながらフォーム フィールド インスタンスを認識していません。

于 2013-09-29T19:48:44.217 に答える
2

autocomplete-light ドキュメント内でこれを行う方法を見つけようとしていました。私はその方法を理解しましたが、少し掘り下げる必要があるので、これが役立つことを願っています.

autocomplete_light_registry.py ファイルで、"name" および "choices" パラメーターを入力します。

#myapp/autocomplete_light_registry.py
autocomplete_light.register(MyModel,
    #... Other Parameters ...
    name = 'SpecialMyModelAutocomplete',
    choices = YourQuerySetHere, #e.g. MyModel.objects.filter(...)
)

デフォルト名は「MyModelAutocomplete」であるため、モデルに複数の登録済みオートコンプリートを含める場合は、どれを使用するかを指定する必要があります (そうしないと、デフォルトではなく、レジストリの最初のものが使用されます)。

指定するには、「autocomplete_names」を使用します。これは、(ドキュメントから)「field_name の辞書: AutocompleteName を使用して、フィールドに使用されるデフォルトのオートコンプリートをオーバーライドします。」私の場合、django admin 内で使用しています。

#myapp/admin.py
class MyModelAdminForm(autocompletelight.ModelForm):
    class Meta:
        model = MyModel
        autocomplete_names = {'field_name':'SpecialMyModelAutocomplete'}

デフォルトのオートコンプリートを使用するフィールドを autocomplete_names に含める必要はないことに注意してください。ちなみに、「autocomplete_exclude」と「autocomplete_fields」もここで重要な場合があり、オートコンプリートを使用して含める/除外するフィールドを指定する ModelAdmin の「フィールド」と「除外」に類似しています。

追加: modelform_factory で「autocomplete_names」を使用することもできます。

form = autocomplete_light.modelform_factory(MyOtherModel,autocomplete_names={MyFieldName:'MyModelAutocomplete'}) #where MyFieldName is a ForeignKey to MyModel

ドキュメントから:

autocomplete_light.forms.modelform_factory(model,autocomplete_fields=None,autocomplete_exclude=None,autocomplete_names=None,registry=None,**kwargs)
于 2015-02-05T23:00:23.440 に答える