2016-11-14 3 views
1

que je suis dans le long DAL documentation d'ajouter un champ filtré à ma forme, mais la transmission ne fonctionne pas pour se connecter un champ à l'autre:Django Autocomplete Light - FK terrain Résultats ne retransmet pas

Forms .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 

J'avais l Mes choix de variété doivent être filtrés par leur relation de clé étrangère avec les objets de base. Les deux champs de saisie semi-automatique fonctionnent correctement, mais le choix du champ commodity n'est pas transmis au VarietyAutocompleteView (ma commande d'impression imprime Commodity:None). Est-ce peut-être parce que je passe un objet clé étrangère? Ou ai-je mis en place de manière incorrecte d'une manière ou d'une autre?

+0

Je suis confronté à un problème similaire .. Comment avez-vous enfin résolu cela? –

+0

Je suis passé de DAL à bootstrap-combobox. Je posterai mon code résultant dans une réponse. –

+0

Ahh .. merci beaucoup! .. –

Répondre

1

J'ai dû abandonner DAL et passer à Bootstrap Combobox. Il s'est avéré très facile à implémenter, à condition d'utiliser les bibliothèques Bootstrap.

Voici comment il est mis en place:

Ajouter une classe combobox au widget select:

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", ... 
     ] 

Ensuite, insérez le javascript snip jamais simple:

inventaire_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 %} 

C'est tout ce qu'il y a à faire.