如何按标签名称以及发布的帖子

时间:2019-07-02 12:29:12

标签: 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 = 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()...

1 个答案:

答案 0 :(得分:1)

它应该是toMatchResult()(带有两个连续的下划线)和canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<boolean> | Promise<boolean> | boolean { console.info(1); return new Promise<boolean>((resove, reject) => { this.authService.judgePass(state.url).subscribe(res => { console.info(3); switch (res.code) { case -1: break; case 0: resove(true); break; case 1: this.showMsg(res.message); this.router.navigate(['/manage/error']); break; case 2: this.router.navigate(['/operate']); break; case 3: break; default: break; } }) }); } judgePass(route: string): Observable<CommonResult> { const url = `${this.baseUrl}/check`; console.info(2); const formData = new FormData(); formData.append('url', route); return this.httpClient.post<CommonResult>(url, formData, {}); } ,因为那是tag__tag_name模型的字段名称:

tag_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(),因为tag = ManyToManyField(Tag)会导致对象的集合,因此使用笼统名称可能更好。