首页 > 解决方案 > 如何通过使用 django 从表单中提供值来动态过滤数据

问题描述

我想根据帖子类别和上传帖子记录的用户过滤博客帖子对象或记录,当我尝试过滤时它给了我一个错误,这就是错误。

ValueError at /dashboard/filter-post/
The QuerySet value for an exact lookup must be limited to one result using slicing.

这是我的models.py

class Category(models.Model):
    cat_name = models.CharField(max_length=100, verbose_name='Category Name')
    cat_desc = models.TextField(blank=True, null=True)

    def __str__(self):
        return self.cat_name

    class Meta():
        verbose_name_plural='Category'

class Post(models.Model):
    pst_title = models.CharField(max_length=150)
    pst_image = models.ImageField(blank=True, null=True, upload_to='uploads/')
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    category = models.ManyToManyField(Category)
    content = models.TextField()
    created = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return self.pst_title

    @property
    def img_url(self):
        if self.pst_image:
            return self.pst_image.url

forms.py

class FilterForm(forms.ModelForm):
    user = forms.ModelChoiceField(
        queryset=User.objects.all(), 
        widget=forms.Select(attrs={'class': 'form-control'}))
    category = forms.ModelMultipleChoiceField(
        queryset=Category.objects.all(), 
        widget=forms.SelectMultiple(attrs={'class': 'form-control js-example-disabled-results'}))
    catch_bot = forms.CharField(required=False, 
                widget=forms.HiddenInput, validators=[validators.MaxLengthValidator(0)])

    class Meta():
        fields = ['user', 'category' ]
        model = Post

views.py

def filter_post(request):
    post = FilterForm(request.GET)
    queryset = Post.objects.all()
    if post.is_valid():
        user=post.cleaned_data.get('user')
        category=post.cleaned_data.get('category')
        if user and category:
            queryset = queryset.filter(user__username=user, category__cat_name=category)
    return render(request, 'backend/filter-post.html', {'query':queryset, 'post':post})

我遇到了挑战,在我的观点中正确过滤这个有什么帮助吗?

标签: djangodjango-modelsdjango-views

解决方案


尝试这个:

而不是这个:

queryset = queryset.filter(user__username=user, category__cat_name=category)

用这个:

queryset = queryset.filter(user=user, category=category)

也不要在模型名称之后命名您的模型字段,只需使用name代替pst_nameor cat_name,您会发现当您尝试访问这些值时不会混淆。

更新

好的,也许尝试像这样重写您的视图:

def filter_post(request):
    posts = Post.objects.all()
    form = FilterForm(request.GET) # its best practice to call your form instance `form` in the view so that the next line has better readability
    if form.is_valid(): 
        user=post.cleaned_data['user']
        category=post.cleaned_data['category']
        if user:
            posts = posts.filter(user=user)
        if category:
            posts = posts.filter(category=category)
    return render(request, 'backend/filter-post.html', {'posts':posts})

推荐阅读