Django 自动完成灯 - FK 字段结果不转发
Django Autocomplete Light - FK Field Results not Forwarding
我正在按照 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
字段的选择不会转发到 VarietyAutocompleteView
(我的打印命令打印 Commodity:None
)。这可能是因为我传递的是外键对象吗?还是我设置不正确?
我不得不放弃 DAL 并转移到 Bootstrap Combobox。如果您使用的是 Bootstrap 库,那么实施起来真的很容易。
这是它的设置方式:
将 class combobox
添加到 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", ...
]
然后,插入最简单的 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 %}
仅此而已。
我会为任何像我一样认为“是的,但我仍然真的不想改变”的人添加 - 实际上是行:
'variety': autocomplete.ModelSelect2(url='variety-autocomplete', forward=['commodity'])
真的对我也不起作用,但将其更改为:
'variety': autocomplete.ModelSelect2(url='variety-autocomplete', forward=('commodity', ))
成功了。请注意,它是一个元组,因此您需要有一个“,”才能使其正常工作,因为它应该是一个可迭代的值。
我没有深入研究为什么数组是文档的一部分但不起作用,但这是使我的变体起作用的关键变化。
此外 - 我使用的是表单集(因此有前缀),事实证明这不是问题。
我正在按照 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
字段的选择不会转发到 VarietyAutocompleteView
(我的打印命令打印 Commodity:None
)。这可能是因为我传递的是外键对象吗?还是我设置不正确?
我不得不放弃 DAL 并转移到 Bootstrap Combobox。如果您使用的是 Bootstrap 库,那么实施起来真的很容易。
这是它的设置方式:
将 class combobox
添加到 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", ...
]
然后,插入最简单的 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 %}
仅此而已。
我会为任何像我一样认为“是的,但我仍然真的不想改变”的人添加 - 实际上是行:
'variety': autocomplete.ModelSelect2(url='variety-autocomplete', forward=['commodity'])
真的对我也不起作用,但将其更改为:
'variety': autocomplete.ModelSelect2(url='variety-autocomplete', forward=('commodity', ))
成功了。请注意,它是一个元组,因此您需要有一个“,”才能使其正常工作,因为它应该是一个可迭代的值。
我没有深入研究为什么数组是文档的一部分但不起作用,但这是使我的变体起作用的关键变化。
此外 - 我使用的是表单集(因此有前缀),事实证明这不是问题。