我有三个模特。
class FilterDefaultValues(BaseModel):
value = models.CharField(max_length=255, null=True, blank=True)
display_value = models.CharField(max_length=255, null=True, blank=True)
class Filter(BaseModel):
name = models.CharField(max_length=255)
default_value = models.ManyToManyField(FilterDefaultValues, blank=True)
class ProductFilter(models.Model):
product = models.ForeignKey(Product, on_delete=models.CASCADE, related_name='filters')
filter = models.ForeignKey(Filter, on_delete=models.CASCADE)
value = models.ForeignKey(FilterDefaultValues, blank=True, on_delete=models.RESTRICT)urls.py
class LinkedDataView(autocomplete.Select2QuerySetView):
def get_queryset(self):
qs = super(LinkedDataView, self).get_queryset()
filter = self.forwarded.get('filter', None)
if filter:
qs = qs.filter(filter_id=filter)
return qs
urlpatterns = [
url(
'^linked_data/$',
LinkedDataView.as_view(model=ProductFilter),
name='linked_data'
),
]forms.py
class ProductFilterForm(forms.ModelForm):
def clean_test(self):
filter = self.cleaned_data.get('filter', None)
value = self.cleaned_data.get('value', None)
if value and filter and value.filter != filter:
raise forms.ValidationError('Wrong owner for test')
return value
class Meta:
model = ProductFilter
fields = ('product', 'filter', 'value', 'value_type', 'product_images', 'is_variation')
widgets = {
'value': autocomplete.ModelSelect2(url='linked_data',
forward=('filter',))
}
class Media:
js = (
'linked_data.js',
)我想要的是当用户选择一个过滤器时,管理面板中的值字段必须使用适当的默认值填充。
但是现在我得到的是:当用户选择filter时,这里只填充productfilter项。
我在这里错过了什么?
发布于 2021-06-23 19:54:58
这是因为您的LinkedDataView.get_queryset()方法使用的是模型ProductFilter,而它应该使用FilterDefaultValues模型。
如果您查看urls.py文件,则会使用model=ProductFilter初始化LinkedDataView。这意味着LinkedDataView.get_queryset()方法将只返回ProductFilter实例。
相反,您希望能够显示FilterDefaultValues实例的建议,这些实例由Filter实例通过Filter.default_value属性引用(多到多)。
为此,您需要创建一个在FilterDefaultValues上操作的新的自动完成视图
urls.py
class FilterDefaultValuesAutocompleteView(autocomplete.Select2QuerySetView):
def get_queryset(self):
qs = super().get_queryset()
filter_id = self.forwarded.get("filter", None)
if filter_id:
qs = qs.filter(filter__id=filter_id)
return qs
urlpatterns = [
url(
"^filter_default_values_autocomplete/$",
FilterDefaultValuesAutocompleteView.as_view(model=FilterDefaultValues),
name="filter_default_values_autocomplete",
),
]然后更新表单类:
forms.py
class ProductFilterForm(forms.ModelForm):
class Meta:
model = ProductFilter
fields = ...
widgets = {
"value": autocomplete.ModelSelect2(
url="filter_default_values_autocomplete",
forward=["filter"],
)
}https://stackoverflow.com/questions/68055543
复制相似问题