Django:将模板值发布到视图

Posted

技术标签:

【中文标题】Django:将模板值发布到视图【英文标题】:Django: posting a template value to a view 【发布时间】:2013-08-26 00:01:25 【问题描述】:

问题:

我要发布到视图并通过使用隐藏的值字段和提交按钮从模板传递值。提交按钮的值(即 csrf_token)通过但隐藏的值没有。我从 Wezkrug 调试器检查了 request.POST 仅包含表单值,而不是我的隐藏字段中的 'id' 值。

背景:

该按钮会将您带到一个表单,您可以在其中输入评论。我正在尝试包含用户正在评论的review.id,以使评论变得容易。我的值是“测试”,不是出于测试目的。

我的表格:

<div>
     <form method='POST' action='/add_comment/'>
         % csrf_token %
         <input type="hidden" name='id' value='test'>
         <input type="submit" value="Make a Comment">
     </form>
</div>

评论视图:

@login_required
def make_comment(request):
    if request.method == 'POST':
        
        form = CommentForm(request.POST)
        if form.is_valid():
            comment = form.save(commit=False)
            comment.user = request.user
            comment.save()
            # render?
            return HttpResponseRedirect('/results/', 
                'restaurant': get_object_or_404(
                                                Restaurant, 
                                                name=request.POST['name'], 
                                                address=request.POST['address']
                                                )
                )
    else:
        form = CommentForm()
    return render(request, 'stamped/comment.html', 'form': form)

评论模型:

class Comment(models.Model):
    content = models.TextField()
    review = models.ForeignKey(Review)
    user = models.ForeignKey(User)
    date_added = models.DateTimeField(auto_now_add=True)

评论ModelForm代码:

class CommentForm(ModelForm):
    class Meta:
        model = Comment
        exclude = ('user', 'review',)

我一直在尝试遵循这个问题中的策略,但使用 request.session 字典是不可取的,因为 Id 必须为每条评论存储一个 id,无论它们是否被评论过。

What is a more efficient way to pass variables from Template to View in Django?

关于如何在 POST 中包含隐藏值的任何想法?谢谢!

【问题讨论】:

您能否发布您对add_comment 操作的查看代码? @Brandon,我已经用评论视图更新了我的问题 我看不到您在视图代码中的任何位置引用 request.POST.get('id') 我正在使用 Werkzeug 交互来检查 request.POST。执行request.POST.get('id') 什么也不返回,request.POST 向我显示了不包含id 值的查询集(我不确定它应该是,我只是认为这将是一个检查的地方) print request.POST 从你的 Django 视图告诉你什么? 【参考方案1】:

views.py

def make_comment(request):
    if request.method == 'POST':
        if 'prepair_comment' in request.POST:
            review = get_object_or_404(Review, pk=request.POST.get('id'))
            form = CommentForm('review': review.id)
            return render(request, 'stamped/comment.html', 
                'form': form,
                )
        else: # save the comment

模型.py

class CommentForm(ModelForm):
        class Meta:
               model = Comment
               exclude = ('user',)
               widgets = 'review': forms.HiddenInput()

餐厅.html

<form method='POST' action='/add_comment/'>
    % csrf_token %
    <input type='hidden' value=' r.id ' name='id'>
    <input type="submit" name='prepair_comment' value="Make a Comment">
</form>

【讨论】:

您好,Goldhand,感谢您的回答。您可以在我上面的问题中看到,我一直在检查 request.POST 的“id”字段,发现它只包含表单值而不是隐藏字段中的“id”值。这是我要解决的问题的症结所在。 感谢您更新您的答案。这是一个很好的解决方案,但r.id 仍然不包含在request.POST QueryDict 中,这仍然是这个过程脱轨的地方。这就是我要克服的障碍。你试过这个代码吗?如果是这样,那么我知道它对我的设置来说是独一无二的。 是的,我通过了 review_id,但不确定在哪里可以找到名称和地址变量。这是错误(你也可以在那里看到评论变量)"Key 'name' not found in &lt;QueryDict: u'content': [u'sdf'], u'csrfmiddlewaretoken': [u'ZqMNTAqahh739ZvUvDLOIn4mwilbDNpd'], u'review': [u'1']&gt;" 啊,这正是我想要完成的!我只是不确定有什么阻碍。 查询字典是否需要包含隐藏值? widgets = 'review': forms.HiddenInput()【参考方案2】:

您可以使用form.cleaned_data 访问该表单。您也可以使用if form.is_valid(),或者如果您想在没有注释时忽略隐藏的测试值,那么您可以使用 if/else 逻辑来忽略隐藏的值if comment is None: 逻辑。

要访问表单并仅在注释不是 None 时记录测试值,views.py 可能如下所示:

 def form_view(request):
      if request.method == 'POST'
        form = form(request.POST)
        if form.is_valid():
          comment = form.cleaned_data['comment']
          # do something with other fields
          if comment is not None:
            id = form.cleaned_data['test']
            # do something with the hidden 'id' test value from the form
         return HttpResponseRedirect('/thanks/')
       else:
         form = form()
       return render(request, 'form.html', 'form': form)

这里是我要参考的 Django 文档:

https://docs.djangoproject.com/en/dev/topics/forms/

【讨论】:

我想你可能对我的问题感到困惑。我在将 cmets 添加到数据库、显示它们或处理表单本身的功能方面没有问题。我希望通过 post 方法将模板值传递给视图。这里恰好是该视图包含ModelForm

以上是关于Django:将模板值发布到视图的主要内容,如果未能解决你的问题,请参考以下文章

如何在 django 的基于类的视图中将值传递给模板?

将模板中的值传递给 Django 中的视图

将 Javascript 值解析为 Django 视图

如何将值从 javascript 函数传递到 django 视图

从 django 中的单个视图呈现多个模板

将 JSON 数组从 Django 视图返回到模板