首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >django-3种模型上的自完全-光依赖滤波器

django-3种模型上的自完全-光依赖滤波器
EN

Stack Overflow用户
提问于 2021-06-20 11:51:10
回答 1查看 172关注 0票数 3

我有三个模特。

代码语言:javascript
运行
复制
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

代码语言:javascript
运行
复制
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

代码语言:javascript
运行
复制
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项。

我在这里错过了什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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

代码语言:javascript
运行
复制
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

代码语言:javascript
运行
复制
class ProductFilterForm(forms.ModelForm):
    class Meta:
        model = ProductFilter
        fields = ...
        widgets = {
            "value": autocomplete.ModelSelect2(
                url="filter_default_values_autocomplete",
                forward=["filter"],
            )
        }
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68055543

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档