1

我正在使用django_ajax库在其中一个表单元素中进行 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那些submittedfalse.

如何编写选择器?

4

1 回答 1

2

正如项目的自述文件中所解释的,您可以使用自定义查找类来实现您的目标。

在你的 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)

请注意,原始字符串应始终使用in和中的escape()函数进行转义。format_matchformat_item_display

就您而言,关键是get_query方法。应用于的过滤器Alpha.objects仅选择未提交的条目。

不要忘记更新您settings.py以使用查找类而不是默认行为:

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