django - 如何通过使用 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})
我遇到了挑战,在我的观点中正确过滤这个有什么帮助吗?
解决方案
尝试这个:
而不是这个:
queryset = queryset.filter(user__username=user, category__cat_name=category)
用这个:
queryset = queryset.filter(user=user, category=category)
也不要在模型名称之后命名您的模型字段,只需使用name
代替pst_name
or 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})
推荐阅读
- python - 使用 Python Click 创建分层命令
- javascript - 加载脚本和清单违反了内容安全策略指令
- java - 运行本机查询时发生 ConverterNotFoundException
- android - 如何确定 GMail 用于传递我的应用程序接收到的文件的 MimeType?
- php - 基本 Stripe 集成无法加载支付页面
- javascript - 如何在 Mongoose 中使用 findByIdAndUpdate 填充数组
- go - 带舵的尺码表
- ckeditor - TYPO3 9.5.4 CKEditor RTE 删除样式属性
- php - Get_where() 带有用户定义的子句
- ios - 如何使clang仅在发布时编译文件?