Django 如何按标签名搜索,以及是否发布帖子
我有两个问题; 第一个;如何按标签名称搜索标签型号是manytomanyfield。 最后一个;如果发布文章,则按标记名显示文章。 我使用以下代码“post_list=post.objects.published()”获取已发布的帖子。 但是,我不知道如何使用过滤器和发布 Models.pyDjango 如何按标签名搜索,以及是否发布帖子,django,django-models,django-views,Django,Django Models,Django Views,我有两个问题; 第一个;如何按标签名称搜索标签型号是manytomanyfield。 最后一个;如果发布文章,则按标记名显示文章。 我使用以下代码“post_list=post.objects.published()”获取已发布的帖子。 但是,我不知道如何使用过滤器和发布 Models.py class Tag(models.Model): tag_name = models.CharField(max_length=50, unique=True) tag_slug = mod
class Tag(models.Model):
tag_name = models.CharField(max_length=50, unique=True)
tag_slug = models.SlugField(max_length=50, unique=True)
class PostQuerySet(models.QuerySet):
def active(self):
return self.filter(status__in=[Post.STATUS_PUBLISHED])
def published(self):
return self.filter(status=Post.STATUS_PUBLISHED)
class Post(models.Model):
STATUS_DRAFT = 1
STATUS_PUBLISHED = 2
STATUSES = (
(STATUS_DRAFT, 'Draft'),
(STATUS_PUBLISHED, 'Published'),
)
category=models.ManyToManyField(Category)
tag=models.ManyToManyField(Tag)
user=models.ForeignKey(User,on_delete=models.CASCADE,verbose_name="Yazar",related_name='posts')
title=models.CharField(max_length=120,verbose_name="Başlık")
content=RichTextField(verbose_name="İçerik")
created_date=models.DateTimeField(auto_now_add=True,verbose_name="Oluşturulma Tarihi")
updated_date=models.DateTimeField(auto_now=True,verbose_name="Güncellenme Tarihi")
image=models.ImageField(null=True,blank=True)
slug=models.SlugField(max_length=130,unique=True)
status = models.SmallIntegerField(choices=STATUSES)
objects = PostQuerySet.as_manager()
views.py
def post_index(request):
#post_list=Post.objects.published().order_by('-created_date')
post_list=Post.objects.published()
query=request.GET.get('q')
if query:
post_list=post_list.filter(
Q(content__icontains=query)|
Q(title__icontains=query) |
Q(tag_name__icontains=query)| # doesn't work
Q(user__first_name__icontains=query)).distinct()...
它应该是
tag\u tag\u name
(带有两个连续的下划线)和tag\u name
,因为这是您的tag
型号的字段名称:
def post_index(request):
#post_list=Post.objects.published().order_by('-created_date')
post_list=Post.objects.published()
query=request.GET.get('q')
if query:
post_list=post_list.filter(
Q(content__icontains=query)|
Q(title__icontains=query) |
Q(tag__tag_name__icontains=query)|
Q(user__first_name__icontains=query)
).distinct()
def post_索引(请求):
#post_list=post.objects.published().order_by('-created_date'))
post_list=post.objects.published()
query=request.GET.GET('q')
如果查询:
post\u list=post\u list.filter(
Q(内容包含=查询)|
Q(title\uu icontains=query)|
Q(tag\uuu tag\u name\uuuuuu icontains=query)|
Q(user\u first\u name\u icontains=query)
).distinct()
但是,我建议将您的
tag=ManyToManyField(tag)
重命名为tags=ManyToManyField(tag)
,因为ManyToManyField
会产生一组对象,因此,复数名称可能更好。异常类型:FieldError异常值:相关字段获得无效查找:name@Enes:您的标签
模型是否有名称
字段?我忘了添加model.py标签;class Tag(models.Model):Tag_name=models.CharField(max_length=50,unique=True)Tag_slug=models.SlugField(max_length=50,unique=True)@Enes:那么它就是Tag_Tag_name
,但是最好还是去掉Tag_
前缀。我说的是post_list=post_list.filter(…)。现在我试着正确地回答了:D谢谢你的答案,正如williem建议的那样,祝你过得愉快我确实认为你需要做tag\uu name\uuuu icontains=query
而不是tag\u name\uuu icontains=query
你也可以发布你的tag
模型吗