3

问题:

我要发布到视图并通过使用隐藏的值字段和提交按钮从模板传递值。提交按钮的值(即 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,无论它们是否被评论过。

在Django中将变量从模板传递到视图的更有效方法是什么?

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

4

2 回答 2

8

视图.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>
于 2013-08-26T10:53:56.953 回答
0

您可以使用 访问表单form.cleaned_data。您也可以使用if form.is_valid()or 如果您想在没有评论时忽略隐藏的测试值,那么您可以使用 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/

于 2013-08-26T01:53:43.033 回答