如何同时使用slug和id,因为我得到的注释\u thread()正好包含3个参数(给定2个)

2024-04-25 06:47:47 发布

您现在位置:Python中文网/ 问答频道 /正文

是否可以在一个函数中同时使用slug和id? 我有这个在我的房间里视图.py你知道吗

@login_required
def comment_thread(request, id, slug):
    hotCat = Category.objects.get_hotCat()
    post = get_object_or_404(Post, slug=slug)
    post.views += 1  # increment the number of views
    post.save()      # and save it

    comment = Comment.objects.get(id=id)
    form = CommentForm()
    context = {
    "form": form,
    "comment": comment,
    "hotCat":hotCat,
    #"post":post
    }
    return render(request, "comments/comment_thread.html", context)

有了这个,我得到注释\u thread()正好取3个参数(给定2个) 所以我觉得问题出在我身上网址.py原来是

url(r'^comment/(?P<id>\d+)$', 'comment_thread', name='comment_thread'),

但即使我换了工作

    url(r'^comment/(?P<id>\d+)/(?P<slug>[\w|\-]+)/$', 'comment_thread', name='comment_thread'),

它给了我找不到的页面。 所以我意识到,问题是

<a href='{{ comment.get_absolute_url }}' target="_blank">

我需要改变

def get_absolute_url(self):
    return reverse('comment_thread', kwargs={"id": self.id})

但这就是我被困的地方。你知道吗

这是我的模型

class Comment(models.Model):
    user = models.ForeignKey(MyProfile)
    parent = models.ForeignKey("self", null=True, blank=True)
    path = models.CharField(max_length=350)
    post = models.ForeignKey(Post, null=True, blank=True, related_name="commented_post")
    text = models.TextField()
    updated = models.DateTimeField(auto_now=True, auto_now_add=False)
    timestamp = models.DateTimeField(auto_now=False, auto_now_add=True)
    active = models.BooleanField(default=True)

    objects = CommentManager()

    class Meta:
        ordering = ['-timestamp']

    def __unicode__(self):
        return self.text


    def get_absolute_url(self):
        return reverse('comment_thread', kwargs={"id": self.id})


class Post(models.Model):

    slug = models.CharField(max_length=255, unique=True)

我只是不知道如何在comment\u线程视图中使用slug作为post,以便在模板中使用post。你知道吗

另外,除了这个问题,有没有人知道如何使target=“\u blank”效果;在HttpResponseRedirect保留现有页面的情况下在新选项卡中打开?你知道吗


Tags: selfidtrueurlautogetreturnmodels
1条回答
网友
1楼 · 发布于 2024-04-25 06:47:47

您需要向模型中添加slug字段。参考以下示例:

class Comment(models.ModelField):
   .... # all other fields
   slug = models.SlugField()

   def save(self, *args, **kwargs):
     if not self.id:
       self.slug = slugify(self.name)
     super(Comment, self).save(*args, **kwargs)

然后你的get_absolute_url就变成了

def get_absolute_url(self):
   return reverse('comment_thread', kwargs={"id" : self.id, "slug" : self.slug})

上面定义的save函数基本上设置了第一次保存模型时的slug(使用其名称作为url)。这可以防止您的评论的url发生更改,即使您稍后编辑它。你知道吗

即使对于Post,也要将slug字段更改为models.SlugField()

相关问题 更多 >