1

フォーム要素の1つでajaxルックアップにdjango_ajaxライブラリを使用していました。

モデル:

class Alpha(models.Model):
    name = models.CharField()
    description = models.TextField()
    submitted = models.BooleanField(default=False)

フォーム

class MyForm(forms.Form):
    alpha = AutoCompleteSelectField('alpha')

    def __init__(self, loser, *args, **kwargs):
        super(MyForm, self).__init__(*args, **kwargs)
        self.loser = loser
        self.fields['alpha'].widget.attrs['class'] = 'big-text-box'

現在の実装の問題は、すべてのalphaエントリが表示されることですが、ルックアップフィールドには、がであるエントリのみalphasが必要submittedですfalse

セレクターを作成するにはどうすればよいですか?

4

1 に答える 1

2

プロジェクトのREADMEで説明されているように、カスタムルックアップクラスを使用して目標を達成できます。

appディレクトリにファイルlookups.py(名前は従来型)を作成し、その中に次のクラスを定義します。

from ajax_select import LookupChannel
from django.utils.html import escape
from django.db.models import Q
from yourapp.models import *

class AlphaLookup(LookupChannel):

    model = Alpha

    def get_query(self,q,request):
        # The real query
        # Here the filter will select only non-submitted entries
        return Alpha.objects.filter(Q(name__icontains = q) & Q(submitted = false)).order_by('name')

    def get_result(self,obj):
        u""" result is the simple text that is the completion of what the person typed """
        return obj.name

    def format_match(self,obj):
        """ (HTML) formatted item for display in the dropdown """
        return escape(obj.name)

    def format_item_display(self,obj):
        """ (HTML) formatted item for displaying item in the selected deck area """
        return escape(obj.name)

escape()生の文字列は、関数informat_matchおよび。を使用して常にエスケープする必要があることに注意してくださいformat_item_display

あなたの場合、重要なのはget_query方法です。に適用されるフィルターは、Alpha.objects送信されていないエントリのみを選択します。

settings.pyデフォルトの動作の代わりにルックアップクラスを使用するように更新することを忘れないでください。

AJAX_LOOKUP_CHANNELS = {
    'alpha' : ('yoursite.yourapp.lookups', 'AlphaLookup'),
}
于 2012-11-16T13:02:07.907 に答える