2012-11-15 39 views
1

我在其中一個表單元素中使用了django_ajax庫進行ajax查找。在django中配置ajax查找ajax_lookup

型號:

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項,但在查找字段我只想其中submittedfalse的那些alphas

如何編寫選擇器?

回答

2

正如項目的README中所述,您可以使用自定義查找類來實現您的目標。

在它創建一個文件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()功能format_matchformat_item_display逃脫。

對您而言,至關重要的是get_query方法。在Alpha.objects上應用的篩選器僅選擇未提交的條目。

不要忘記更新您的settings.py,而不是使用缺省行爲查找類:

AJAX_LOOKUP_CHANNELS = { 
    'alpha' : ('yoursite.yourapp.lookups', 'AlphaLookup'), 
}