django-select2小部件的Queryset被忽略
在我的项目中,我大量使用Django-Select2,尤其是它的ModelSelect2Widget,因为我的用户经常需要从2000-6000项列表中进行选择。到目前为止,在我对它的所有使用中,小部件的queryset始终被称为模型的“.all()”实例,供用户选择,没有任何问题 然而,现在,我在项目的不同部分有了实现,对于这些实现,过滤小部件选项的查询集是必要的。然而,在所有这些情况下,对queryset的任何修改似乎都没有效果,我想知道小部件本身是否有问题 在主要情况下,数据库中的项目被布尔标记为活动/非活动(约65%为非活动),我只需要有活动项目供最终用户选择 我能够通过shell正确过滤查询 在表单定义中,任何筛选(“.filter(flag_active=True)”,甚至将queryset设置为“.none()”无效–下拉/自动完成中的选项没有明显变化。由于它是select2输入,我一次只能查看少量项目,但初始检索的总体和键入时的筛选选择都表明没有遵循过滤器django-select2小部件的Queryset被忽略,django,django-forms,Django,Django Forms,在我的项目中,我大量使用Django-Select2,尤其是它的ModelSelect2Widget,因为我的用户经常需要从2000-6000项列表中进行选择。到目前为止,在我对它的所有使用中,小部件的queryset始终被称为模型的“.all()”实例,供用户选择,没有任何问题 然而,现在,我在项目的不同部分有了实现,对于这些实现,过滤小部件选项的查询集是必要的。然而,在所有这些情况下,对queryset的任何修改似乎都没有效果,我想知道小部件本身是否有问题 在主要情况下,数据库中的项目被布尔
MODEL:
class Inventory_product_base(models.Model):
id = models.UUIDField(primary_key=True,default=uuid.uuid4,null=False)
upc = models.CharField(max_length=96,null=True,blank=True)
name = models.CharField('Item name',max_length=96,null=False)
flag_active = models.BooleanField("Active item",default=True)
price = models.DecimalField(max_digits=8,decimal_places=3,null=True,blank=True)
unit_of_measure = models.CharField('UOM',max_length=24, choices=UNITS_OF_MEASURE,default='EACH')
spec = models.CharField(max_length=36,null=True,blank=True)
category = models.ForeignKey(Inventory_category,on_delete=models.CASCADE,related_name='cat_products')
subcategory = models.ForeignKey(Inventory_subcategory,on_delete=models.CASCADE,related_name='subcat_products')
note = models.CharField(max_length=275,null=True,blank=True)
def __str__(self):
return str(self.name)
FORM:
class InventoryCatalogUpdateProductsForm(forms.ModelForm):
parent_product_base = forms.ModelChoiceField(
queryset=Inventory_product_base.objects.filter(flag_active=True),
label=u"",
widget=ModelSelect2Widget(
model=Inventory_product_base,
search_fields=['name__icontains'],
attrs={'data-placeholder': 'Select product...', 'data-width': '100%'},),)
class Meta():
model = Inventory_unit_catalog
fields = ('parent_product_base',)
class InventoryCatalogUpdateAllProductsForm(forms.ModelForm):
parent_product_base = forms.ModelChoiceField(
queryset=Inventory_product_base.objects.all(),
label=u"",
widget=ModelSelect2Widget(
model=Inventory_product_base,
search_fields=['name__icontains'],
attrs={'data-placeholder': 'Select product...', 'data-width': '100%'},),)
class Meta():
model = Inventory_unit_catalog
fields = ('parent_product_base',)
InventoryCatalogUpdateProductsFormset = modelformset_factory(model=Inventory_unit_catalog,form=InventoryCatalogUpdateProductsForm,extra=10,can_delete=True)
InventoryCatalogUpdateAllProductsFormset = modelformset_factory(model=Inventory_unit_catalog,form=InventoryCatalogUpdateAllProductsForm,extra=10,can_delete=True)
VIEW:
if product_flag == 'active':
formset = InventoryCatalogUpdateProductsFormset(queryset=parent_unit_catalog.products.filter(flag_active=True))
else:
formset = InventoryCatalogUpdateAllProductsFormset(queryset=parent_unit_catalog.products.all())
如前所述,如果我将上面的queryset更改为.none()(或在小部件或视图中的任何其他内容),则select2字段中呈现的选项没有区别
我尝试过独立、并行的表单和表单集。最初,我尝试了一种更复杂的方法,通过添加以下内容,在单个表单中传递参数并选择不同的查询集:
def __init__(self, *args, **kwargs):
self.product_flag = kwargs.pop('product_flag')
super(InventoryCatalogAddToForm, self).__init__(*args, **kwargs)
print("__init__ has product_flag: ",self.product_flag)
if self.product_flag == 'active':
self.fields['parent_product_base'].queryset = Inventory_product_base.objects.filter(flag_active=True)
print("Screened for flag_active=True")
else:
self.fields['parent_product_base'].queryset = Inventory_product_base.objects.all()
print("Screened for flag_active=False")
我能够通过调试打印验证是否执行了正确的过滤器选择,但没有任何效果。因此,我回到了一种更简单、更直接的方法,即单独的表单,但仍然没有任何结果
欢迎提供任何建议。我的项目已经进行了几个月,Django-Select2是其中的一个基础,我不想知道它无法过滤Select2输入,我需要找到一个替代项。
self.fields['parent\u product\u base']。queryset
为formfield设置queryset(即允许的验证选择)
使用
self.fields['parent\u product\u base'].widget.queryset
设置小部件的选择。self.fields['parent\u product\u base'].queryset
为表单字段设置查询集(即允许的验证选择)
使用
self.fields['parent\u product\u base'].widget.queryset
设置小部件的选择。您是否尝试过通过shell创建小部件并检查其queryset属性/get\u queryset方法?如果这些字段被正确筛选,问题可能是select2AutoResponseView
。另外:self.fields['parent\u product\u base'].queryset
设置表单字段的查询集(即允许的验证选项),使用self.fields[foo].widget.queryset
设置小部件的选项。@CoffeebasedLieform谢谢-我没意识到您可以指定两个不同的查询集(一个用于验证,一个用于小部件),我假设单个集合同时起到了两个作用。在.widget.queryset
上进行过滤产生了所有的不同!请将您的评论作为答案重新发布,我将标记为所有internet点。您是否尝试通过shell创建小部件并检查其queryset属性/get\u queryset方法?如果这些检查结果被正确过滤,t问题可能在于select2自动响应查看
。另外:self.fields['parent\u product\u base']。queryset
设置表单字段的queryset(即允许的验证选项),使用self.fields[foo].widget.queryset
来设置小部件的选择。@CoffeeBasedLifeform谢谢-我没有意识到您可以指定两个不同的queryset(一个用于验证,一个用于小部件),我假设这一组同时起到了两个作用。在.widget.queryset
上进行过滤产生了所有的不同!请将您的评论作为答案重新发布,我将标记为所有的互联网点