2016-12-19 3 views
0

Je ne peux pas obtenir django-autocomplete-light pour transmettre des valeurs quand PAS dans admin. Voici le problème: J'ai 2 boîtes de sélection liées. C'est pour une application de connexions de train, donc quand vous sélectionnez Ville de la première case (départ), seules les villes de destination pour lesquelles il y a une connexion doivent apparaître sur la seconde.django-autocomplete-light: Transférer fonctionne bien dans admin mais renvoie None lorsqu'il est utilisé dans le modèle

Les modèles simplifiés:

class City(models.Model): 
    name = models.CharField(max_length=64) 
    destinations = models.ManyToManyField(
     'self', 
     symmetrical=False, 
     through='Connection') 

class Connection(models.Model): 
    departure = models.ForeignKey(
     City, 
     on_delete=models.CASCADE, 
     related_name='departure') 
    destination = models.ForeignKey(
     City, 
     on_delete=models.CASCADE, 
     related_name='destination') 

Et voici mon point de vue:

class DepartureAutocomplete(autocomplete.Select2QuerySetView): 

    def get_queryset(self): 
     qs = City.objects.all() 
     if self.q: 
      qs = qs.filter(name__istartswith=self.q) 
     return qs 


class DestinationAutocomplete(autocomplete.Select2QuerySetView): 
    def get_queryset(self): 
     qs = City.objects.all() 
     departure = self.forwarded.get('departure', None) 
     if not departure: 
      return [] 
     else: 
      qs = qs.filter(id=departure)[0].destinations.all() 
     if self.q: 
      qs = qs.filter(name__istartswith=self.q) 
     return qs 


class HomeView(generic.UpdateView): 
    model = City 
    form_class = ConnectionForm 
    template_name = 'intercity/home_template.html' 
    success_url = reverse_lazy('home_view') 

    def get_object(self): 
     return City.objects.first() 

Enfin mon forms.py:

class ConnectionForm(forms.ModelForm): 
    departure = forms.ModelChoiceField(
     queryset=City.objects.all(), 
     widget=autocomplete.ModelSelect2(
      url='departure-autocomplete' 
     ) 
    ) 
    destination = forms.ModelChoiceField(
     queryset=City.objects.all(), 
     widget=autocomplete.ModelSelect2(
      url='destination-autocomplete', 
      forward=['departure', ] 
     ) 
    ) 

    class Meta: 
     model = Connection 
     fields = ('__all__') 

Tout fonctionne bien dans l'admin (dans Ajouter Page de connexion), mais j'ai besoin d'exposer cela à l'extrémité avant. La structure html rendue semble la même que dans la page d'administration, mais l'ID transféré du premier champ select n'est pas transmis correctement (None).

Des conseils/aide appréciés!

Répondre

0

OK - je l'ai. Dans le cas où je peux sauver quelqu'un d'autre de perdre du temps comme je l'ai fait:

Dans le modèle, je juste du rendu {{ form.as_p }} Il devrait être dans une balise de forme! Comme dans:

<form> 
    {{ form.as_p }} 
</form>