无法将POST参数传递给Django视图

无法将POST参数传递给Django视图,django,django-forms,django-templates,django-views,http-post,Django,Django Forms,Django Templates,Django Views,Http Post,我已经创建了一个Django视图和一个附带的url。我正试图让这个视图接受一个POST参数,但这个方法不起作用。这是我正在设置的自定义应用程序的一部分,用于向移动设备发送推送通知 My views.py是: class DeviceCreateView(FormView): model = DeviceObj form_class = DeviceForm template_name = "deviceobj_form.html" def form_valid(s

我已经创建了一个Django视图和一个附带的url。我正试图让这个视图接受一个POST参数,但这个方法不起作用。这是我正在设置的自定义应用程序的一部分,用于向移动设备发送推送通知

My views.py是:

class DeviceCreateView(FormView):
    model = DeviceObj
    form_class = DeviceForm
    template_name = "deviceobj_form.html"
    def form_valid(self, form): 
        if self.request.method == 'POST':
            reg_id = self.request.POST.get("registration_id")
            DeviceObj.objects.create(registration_id=reg_id)
我的URL.py是:

urlpatterns = [
    url(r'^admin/', include(admin.site.urls)),
    url(r'^$', home, name='home'),
    url(r'^registration_id/$', DeviceCreateView.as_view(), name='registration_id'),
    url(r'^success/$', success, name='success'), 
]
我的模板是:

<form method="POST" action="{% url 'registration_id' %}">
{% csrf_token %}
<input type="hidden" name="registration_id" value="{{ registration_id }}">
</form>

{%csrf_令牌%}
我正在使用Mozilla上的插件尝试向上面的安排发送POST参数。我发布到,将参数名称设置为“registration_id”,然后给它一个示例值(例如“testing123”)。作为响应,我得到一个200状态,具有以下转储:

<form method="POST" action="/registration_id/">
<input type='hidden' name='csrfmiddlewaretoken' value='PAPSwkpe1rU9c9ln4Jz0i6QKeyT57Cdf' />
<input type="hidden" name="registration_id" value="">
</form>  

如果我通过手动输入(即从输入标签中删除type=“hidden”)执行相同的操作,它将非常有效。但使用POSTER,我似乎无法得到201(已创建)响应(即,我的数据库中没有显示任何内容)。这件事已经困扰我好几天了

两个问题

  • form\u valid()
    

  • redirect()
    接受模型/视图名称/url,而不仅仅是模板名称


  • 不清楚您试图如何处理这个隐藏字段,但是您应该通过模板中的“form”变量加载字段

    <form method="POST" action="{% url 'registration_id' %}">
    {% csrf_token %}
    {{ form }}
    </form>
    
    更新


    正如下面的评论所指出的,问题在于通过Mozilla POSTER插件发布的帖子缺少csrf_标记。将其添加到中可以让帖子通过。

    表单的有效函数有问题,您正在重定向到没有任何上下文变量的模板。公平地说,我会解决这个问题。但那不是致命的,对吗?尽管如此,我的观点还是应该接受POST参数,no?Django不会从表单POST生成201s,除非您专门编写了一些代码让它这样做。您在这里显示的帖子应该会导致503错误,因为您缺少csrf令牌。你确定你发布到了正确的URL吗?例如,你需要一个尾随斜杠吗?我会检查。谢谢你来这里顺便说一句!知道了。CSRF标记和尾随斜杠是罪魁祸首。非常感谢!很公平,我已经注意到了这一点,并将做出改变。但是(1)和(2)都不是致命的,对吗?这件事应该仍然有效(当我通过文本字段手动执行时也是如此)。嗯,您建议{form.as_p}}并在我的视图中使用HiddenInput()来解决我在接受POST参数时遇到的问题?不是在您的视图中,隐藏的输入进入DeviceForm,然后传递给模板。然后,在form\u valid()方法中,您可以直接访问发布的值:
    device\u obj=form.save()
    遗憾的是,该建议不起作用。。。您能给我一个简单的分步指南,告诉我如何让Django服务器从客户端接受POST参数吗?我正在尝试注册设备的注册ID以设置Google云消息推送通知。如果我能运行一个简单的示例,我会处理剩下的问题。Django服务器始终接受来自客户端的POST参数,这是默认情况下应该发生的事情——您的浏览器是一个客户端,理论上不应该与您使用的Mozilla插件有任何区别。如果将表单字段设置为可见,使用浏览器加载DeviceCreateView URL并从中发布,会发生什么情况?尝试打印出这种情况下的帖子和插件中的帖子,并进行比较。此外,我修改了答案,将表单包含在{{form}}中,而不是使用as_table或as_p。当FormView收到无效表单并重新加载模板时,这将打印与表单相关的任何错误。
    class DeviceForm(forms.ModelForm):
        class Meta:
            model = DeviceObj
            fields = ['registration_id']
    
        def __init__(self, *args, **kwargs):
            super(DeviceForm, self).__init__(*args, **kwargs)
            self.fields['registration_id'].widget = forms.HiddenInput()