【问题标题】:using django-autocomplete-light outside admin view在管理视图之外使用 django-autocomplete-light
【发布时间】:2016-09-10 02:28:19
【问题描述】:

我读过http://django-autocomplete-light.readthedocs.io/en/master/tutorial.html#using-autocompletes-outside-the-admin

并尝试在一个简单的 html 页面中使用该小部件,但它不起作用,并且没有 JavaScript 或 Python 错误。 这是我的代码:

# models.py
class Doctor(models.Model):
    name = models.CharField(max_length=200)
    address = models.CharField(max_length=200, null=True, blank=True, default='')
    def __unicode__(self):
        return self.name

class Patient(models.Model):
    name = models.CharField(max_length=200)
    sample = models.OneToOneField(Sample, null=True, blank=True)
    doctor = models.ForeignKey(Doctor, null=True, blank=True, default=None)
    def __unicode__(self):
        return self.name

# views.py
class DoctorAutocomplete(autocomplete.Select2QuerySetView):
    def get_queryset(self):
        if not self.request.user.is_authenticated():
            return Doctor.objects.none()

        qs = Doctor.objects.all()
        if self.q:
            qs = qs.filter(name__icontains=self.q)

        return qs


class DocForm(autocomplete.FutureModelForm):
    class Meta:
        model = Doctor
        fields = ('name',)
        widgets = {
            'doctor': autocomplete.ModelSelect2(url='doc-autocomplete'),
        }

class Index(generic.UpdateView):
    model = Doctor
    form_class = DocForm
    template_name = 'index.html'
    success_url = reverse_lazy('index')

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


# index.html
<html>
<head>
<script type="text/javascript" src="/static/admin/js/jquery.js"></script>
</head>
<body>
Welcome
    <div>
        <form action="" method="post">
            {% csrf_token %}
            {{ form.as_p }}
            <input type="submit" />
        </form>
    </div>
</body>
</html>

我想要的只是使用他们漂亮的 select2 小部件在自动完成中列出带有医生 ID 的医生姓名作为值。我可以在没有 django-autocomplete-light 的情况下做到这一点,但我明确地想学习如何使用他们看起来更好的小部件来做到这一点。 有人可以指导我让它工作吗?

【问题讨论】:

    标签: django django-autocomplete-light


    【解决方案1】:

    更新

    您应该在Patient 模型中覆盖'doctor' 属性的小部件,而不是Doctor 模型:

    class DocForm(autocomplete.FutureModelForm):
        class Meta:
            model = Patient
            fields = ('doctor',)  # or ('__all__')
            widgets = {
                'doctor': autocomplete.ModelSelect2(url='doc-autocomplete'),
            }
    

    此外,请确保访问 reverse('doc-autocomplete') 网址会为登录用户提供预期结果,如 autocomplete tutorial. 中所述


    试图解决类似的问题,我发现我的模板中没有包含{{ form.media }}

    docs中有描述:

    {% block footer %}
    <script type="text/javascript" src="/static/collected/admin/js/vendor/jquery/jquery.js"></script>
    
    {{ form.media }}
    {% endblock %}
    

    【讨论】:

    • 谢谢。我试过了,但它仍然没有加载小部件;没有 javascript 错误或 python 错误。
    • @max 在 autocomplete-light 存储库中,有一个 working example 的这个字段。您是否有可能在那里找到解决方案?
    • 我已经看到了该链接,正如它在我的帖子中所说的那样。一定是我遗漏了一些小事。
    • @max 我已经更新了我的答案,关于DocForm 中的错误配置。希望对您有所帮助!
    【解决方案2】:

    我明白了:

    class PatForm(autocomplete.FutureModelForm):
        class Meta:
            model = Patient
            fields = ('doctor',)
            widgets = {
                'doctor': autocomplete.ModelSelect2Multiple(url='doc-autocomplete'),
            }
    
    class Index(generic.UpdateView):
        model = Patient
        form_class = PatForm
        template_name = 'index.html'
        success_url = reverse_lazy('index')
    
        def get_object(self):
            return Doctor.objects.first()
    

    产生:

    如果您将 ModelSelect2Multiple 替换为 ModelSelect2 然后你会得到:

    【讨论】:

    • 我很高兴你解决了它。我将在我的答案的相关部分纠正疏忽,谢谢!
    猜你喜欢
    • 2016-03-17
    • 2015-06-01
    • 2016-10-12
    • 1970-01-01
    • 2015-10-15
    • 2015-08-25
    • 1970-01-01
    • 2017-12-02
    • 2018-09-20
    相关资源
    最近更新 更多