django-autocomplete-light:转发在admin中正常工作,但在模板中使用时返回None

时间:2016-12-19 14:48:06

标签: ajax django django-autocomplete-light

我不能让django-autocomplete-light在非管理员时转发值。问题在于:我有2个链接的选择框。这是一个火车连接应用程序,所以当您从第一个框(出发)选择城市时,只有目的地 - 有连接的城市应出现在第二个。

简化模型:

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')

以下是我的观点:

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()

最后我的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__')

管理中的一切正常(在“添加连接”页面中),但我需要将其暴露给前端。渲染的html结构与管理页面中的结构相同,但第一个选择字段的转发ID未正确传递(无)。

任何提示/帮助表示赞赏!

1 个答案:

答案 0 :(得分:0)

好的 - 明白了。如果我可以像其他人一样浪费时间来拯救其他人:

在模板中,我只是渲染{{ form.as_p }} 它应该在表单标签内!如:

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