【问题标题】:Django Autocomplete Light - FK Field Results not ForwardingDjango Autocomplete Light - FK 字段结果未转发
【发布时间】:2016-11-14 20:03:25
【问题描述】:

我正在关注 DAL documentation 向我的表单添加过滤字段,但转发无法将一个字段连接到另一个:

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

我希望通过它们与 Commodity 对象的外键关系过滤我的 Variety 选项。两个自动完成字段都可以正常工作,但是来自commodity 字段的选择不会被转发到VarietyAutocompleteView(我的打印命令打印Commodity:None)。这可能是因为我正在传递一个外键对象吗?还是我以某种方式设置不正确?

【问题讨论】:

  • 我也遇到了类似的问题。你最后是怎么解决的?
  • 我从 DAL 切换到 bootstrap-combobox。我将在答案中发布我的结果代码。
  • 啊.. 非常感谢!..

标签: django django-autocomplete-light


【解决方案1】:

我会为像我这样想“是的,但我仍然真的不想改变”的其他人添加 - 实际上是这样的:

 'variety': autocomplete.ModelSelect2(url='variety-autocomplete', forward=['commodity'])

真的对我也不起作用,但将其更改为:

 'variety': autocomplete.ModelSelect2(url='variety-autocomplete', forward=('commodity', ))

确实有效。请注意,它是一个元组,因此您需要有一个 "," 以使其工作,因为它应该是一个可迭代的值。

我没有深入研究为什么数组是文档的一部分但它不起作用,但这是使我的变体起作用的关键变化。

另外 - 我使用的是表单集(所以有前缀),事实证明这不是问题。

【讨论】:

    【解决方案2】:

    我不得不放弃 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 片段:

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

    仅此而已。

    【讨论】:

      猜你喜欢
      • 2016-07-05
      • 1970-01-01
      • 1970-01-01
      • 2015-06-04
      • 2017-12-02
      • 1970-01-01
      • 1970-01-01
      • 2018-03-08
      • 1970-01-01
      相关资源
      最近更新 更多