2016-11-14 39 views
1

我沿着DAL documentation下一個過濾字段添加到我的形式,但轉發不工作,一個字段連接到其他:Django的自動完成光 - FK域結果不轉發

形式的.py

class PurchaseForm(forms.ModelForm): 

    commodity = forms.ModelChoiceField(
     queryset=Commodity.objects.all(), 
     widget=autocomplete.ModelSelect2(url='commodity-autocomplete'), 
     required=False, 
    ) 

    class Meta: 
     model = Purchase 
     fields = ["variety"] 
     widgets = { 
      'variety': autocomplete.ModelSelect2(url='variety-autocomplete', forward=['commodity'], 
     } 

Views.py

class VarietyAutocompleteView(autocomplete.Select2QuerySetView): 
    def get_queryset(self): 
     qs = Variety.objects.all() 

     commodity = self.forwarded.get('commodity', None) 
     print("Commodity:" + str(commodity)) 
     if commodity: 
      qs = qs.filter(commodity=commodity) 

     if self.q: 
      qs = qs.filter(name__istartswith=self.q) 

     return qs 

我倒是升將我的各種選擇按照與商品對象的外鍵關係過濾。兩個自動完成字段都可以自行工作,但是commodity字段中的選項未被轉發至VarietyAutocompleteView(我的打印命令打印爲Commodity:None)。這可能是因爲我傳遞了一個外鍵對象?或者我以某種方式錯誤地設置了它?

+0

我正面臨類似的問題..你是如何最終解決這個問題的? –

+0

我從DAL切換到bootstrap-combobox。我會將我的結果代碼發佈在答案中。 –

+0

啊..非常感謝! –

回答

1

我不得不報廢DAL並轉移到Bootstrap Combobox。事實證明,實現起來非常簡單,只要您使用Bootstrap庫。

這是它是如何設置:

添加類combobox的選擇控件:

forms.py

from django import forms 

from Business.models import Company, Branch 
from .models import Variety 

class PurchaseForm(forms.ModelForm): 

    variety = forms.ModelChoiceField(
     queryset=Variety.objects.all(), 
     widget=forms.Select(attrs={'class': 'combobox'}), 
     required=False 
    ) 

    class Meta: 
     model = Purchase 
     fields = [ 
      "invoice", "contract_date", ... 
     ] 

然後,不斷插入簡單的JavaScript SNIP:

inventory_report.html

.... 

<td style="padding-bottom: 10px"> 
    <div>Supplier:</div> 
    <div>{{ view.purchase_form.supplier }}</div> 
</td> 

.... 
{% block scripts %} 
    <script type="text/javascript" src="http://code.jquery.com/ui/1.10.3/jquery-ui.js"></script> 
    <script type="text/javascript" src="{% static 'js/bootstrap-combobox.js' %}"></script> 

     $(document).ready(function(){ 

      // Set Text Autofields on New Contract 
      $('.combobox').combobox(); 

     }); 

    </script> 
    {{ view.purchase_form.media }} 
{% endblock %} 

這就是它的全部。