【问题标题】:Django template not receiving value from URLDjango 模板未从 URL 接收值
【发布时间】:2020-05-02 00:16:41
【问题描述】:

Django 专家和爱好者们好!

我有以下情况(源码在文末):

我有一个 DetailView 用于 post 模型的模板(即显示特定帖子实例的详细信息)。在这个模板中,我在模板中有 context_object_name post - 该对象有一个 ID。在这个 DetailView 中,有一个指向另一个 CreateView 模板的 URL 链接。该创建视图适用于 comment 模型。 postcomment 之间存在外键关系 - 一个帖子可以有 0 - 多个 cmets。

当我点击 post 的 DetailView 时,我有一个 CreateView 链接以供评论。当用户为帖子撰写评论并点击保存按钮时,我需要在 CreateView 模板中的模板中提供 post.id(我想将其作为隐藏字段发送到表单中以供评论以便 comment 模型在 save() 方法中具有 post.id - 这将涵盖保存 comment 时需要外键)。

现在我的问题的优点:

我想将一个 post.id 从 DetailView 模板发送到 CreateView 模板(这样我就可以将它用作隐藏表单)。问题是,CreateView 的模板没有收到 post.id 以供评论。涵盖我需求的源代码如下:

DetailView的模板(post的),即链接到CreateView的url(用于comment):

<a  class="btn btn-danger" href="{% url 'commentpost' post_id=post.id %}">Reagovat</a>

应用程序级 urls.py 的一行处理 commentpost URL:

path('commentpost/<int:post_id>/',CommentPostView.as_view(),name='commentpost')

我在想commentpost URL 的模板应该有{{ post_id }} 值可用......但是,commentpost 模板中的一个是空的->commentpost 模板中的一行: &lt;tr&gt;&lt;td&gt;ID:{{ post_id }}&lt;/td&gt;&lt;/tr&gt;.

CreateView 进行评论:

class CommentPostView(CreateView):
    model = Comment
    context_object_name = 'comment'
    form_class = NewCommentForm
    template_name = 'new_comment.html'

评论模型:

class Comment(models.Model):
    post = models.ForeignKey(Post,on_delete=models.CASCADE)
    author = models.CharField(max_length = 100, choices = DEPARTMENTS)
    date_sent = models.DateTimeField()
    text = models.TextField(max_length = 255)

基本上流程应该如下: 1) DetailView 模板发送post_id -> 2) urls.py 处理post_id 值 - 调用正确的视图 3) 视图渲染模板和模板接收post_id 值。

我 100% 确定步骤 1) 中的 post_id 值不为空。步骤 1) 的 URL,即 DetailView 如下所示:http://192.168.56.101:8080/detailpost/1360

你们有没有人知道我错过了什么?

非常感谢您的任何建议,请注意。

【问题讨论】:

  • post_id 将在CommentPostView 中可用,并且由于您在create view 中有post_id,因此您不需要在模板中包含它,但是,将其放入您需要使用context data 传递它的模板。你能告诉我你的 CreateView 吗?
  • 您好 Radico,CreateView 已添加到我的原始帖子中。

标签: django django-templates django-urls


【解决方案1】:

get_context_data 方法将使post_id 在模板中可用:

class CommentPostView(CreateView):
    model = Comment
    context_object_name = 'comment'
    form_class = NewCommentForm
    template_name = 'new_comment.html'

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['post_id'] = self.kwargs.get('post_id', None)
        return context

【讨论】:

  • 谢谢 Radico,在您的帮助下,我已经实现了我所需要的。你说我不需要模板中的post_id,我可以在View中操作post_id。但是,我还不清楚这个概念。原因如下:我可以影响与数据库交互的方法 save() 与模型相关,而不是视图。如何操作 View 中的数据存储?将我指向帮助或其他资源就足够了。这里无需详细解释。谢谢!
  • 欢迎。只需将模型导入您的视图,您就可以完全控制与数据库的反应,我建议您通过 django documentations 这是有史以来最好的资源。
【解决方案2】:

@Radico 的回答很好。另一种方法是在视图中获取对象(如果您需要 id 旁边的其他字段)。在模板中,您可以通过object.id

访问它
def get_object(self, queryset=None):
    return get_object_or_404(Post, pk=self.kwargs['post_id'])

【讨论】:

  • 谢谢。我已使用 Radico 的答案作为解决方案。你的回答也帮助了我。显然,我需要填补一些 Django 知识空白。我会尽量自己进行这个项目。如果我有其他无法自行解决的问题,我会再次向这个很棒的社区寻求帮助。
猜你喜欢
  • 2022-01-18
  • 1970-01-01
  • 2017-02-20
  • 1970-01-01
  • 2018-10-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-11
相关资源
最近更新 更多