基于 django class 的视图 post 方法不从其他方法读取
django class based views post method not reading from other methods
我正在 运行ning classed 基于 django 的视图。很奇怪我的 post 方法没有采用 class.
中的其他方法
我的 get_context_data 工作并且可以接受并打印 self.get_msg(),但是,当我 运行 它时,我的 post 方法将我带到一个页面找不到 404 页面,因为我在 post 函数中包含了 self.get_msg() 函数。我需要 post 函数来接收一些参数,以便将其保存在模型中。
有谁知道为什么会这样,我该如何解决?欢迎任何建议。
谢谢
class OpeningConfirmApp(LoginRequiredMixin, FormMixin, TemplateView):
template_name = 'opening/opening_confirm_app.html'
form_class = PriceForm
def get_msg(self, *args, **kwargs):
msg_id = self.request.GET.get("msg_id")
msg = get_object_or_404(Message, pk=msg_id)
parent_msg_id = msg.parent_id
msg = get_object_or_404(Message, pk=parent_msg_id)
return msg
def get_context_data(self, *args, **kwargs):
context = super(OpeningConfirmApp, self).get_context_data(*args, **kwargs)
#working
print self.get_msg()
return context
def post(self, request, *args, **kwargs):
#not working
print self.get_msg()
form = self.get_form()
if form.is_valid():
price = form.cleaned_data.get("price")
return self.form_valid(form)
def get_success_url(self):
msg = self.get_msg()
messages.success(self.request, "Your application has been sent.")
return reverse('MessageDetail', kwargs={'pk': msg.id})
下面是我的 html 如果有帮助的话。
<br>
<form action="{% url 'OpeningConfirmApp' %}" method="get" style="display: inline">
<input type="hidden" name="msg_id" value="{{object.id}}">
<input class='btn btn-success' type="submit" value="Apply for Opening">
</form>
<br>
您的 get_msg()
方法尝试从 request.GET
获取 msg_id
。此密钥不会在 POST 请求中设置,因此 msg_id
将是 None
,因此 get_object_or_404
将加注。
此处的规范解决方案是将 "msg_id" 作为 url 的一部分而不是作为 GET 参数传递。你的 url 正则表达式看起来像
r"/msg/something/(?P<msg_id>\d+)/$",
无论请求方法如何,您都会在视图的 kwargs 中得到 "msg_id"。
如果你真的必须将它作为请求参数,那么你需要将它传递回实际发布到你的视图的表单(你在这里只显示了一个执行 GET 请求的表单)。
您不希望您的表单具有 post 方法而不是 get 方法吗?
<form action="{% url 'OpeningConfirmApp' %}" method="POST" style="display: inline">
否则它根本不会到达您的 POST 方法。 (这可能就是为什么您看不到 post 方法的打印语句的原因)。
正如 Bruno 所说,您的 get_msg 方法是从 request.GET 而不是 request.POST 获取数据,因此您需要同时检查两者。 (Django 曾经提供 request.REQUEST 方法来访问 GET 和 POST 字典,但我看到它已从 1.10 开始被删除。)
我在研究了 bruno desthuilliers 给出的提示后找到了解决方案。这个解决方案需要我做另一个 url 和功能。新函数重定向到我的主要函数来执行 posting.
我必须添加另一个url.py来收集基于第一个url中pk的msg_id。
url(r'^messagedetail/(?P<pk>[0-9]+)/appoffconf$', AppOffConf, name='AppOffConf'),
并向 view.py 添加另一个功能来记录会话,然后将其重定向到我的主要功能。
def AppOffConf(request, pk):
request.session["msg_id"] = pk
return redirect("OpeningConfirmApp")
这样它可以检索 msg_id 而不需要同时使用 post 和 get(这会使我的提交变得复杂,wobbily_col 提到了 request.REQUEST 方法来访问 GET POST 词典已在我正在使用的 1.10 中删除)因此,我执行 post 的主要功能将更改为 self.request.session.get("msg_id") 而不是 self.request.GET.get("msg_id")
class OpeningConfirmApp(LoginRequiredMixin, FormMixin, TemplateView):
template_name = 'opening/opening_confirm_app.html'
form_class = PriceForm
def get_msg(self, *args, **kwargs):
#changed from - msg_id = self.request.GET.get("msg_id")
msg_id = self.request.session.get("msg_id")
msg = get_object_or_404(Message, pk=msg_id)
parent_msg_id = msg.parent_id
msg = get_object_or_404(Message, pk=parent_msg_id)
return msg
def get_context_data(self, *args, **kwargs):
context = super(OpeningConfirmApp, self).get_context_data(*args, **kwargs)
#working
print self.get_msg()
return context
def post(self, request, *args, **kwargs):
#working now
print self.get_msg()
form = self.get_form()
if form.is_valid():
price = form.cleaned_data.get("price")
return self.form_valid(form)
def get_success_url(self):
msg = self.get_msg()
messages.success(self.request, "Your application has been sent.")
return reverse('MessageDetail', kwargs={'pk': msg.id})
html 更改为将表单按钮定向到第一个 url/function,然后它将被重定向到我的主要功能以执行 posting。
<form action='appoffconf' method="post" style="display: inline">{% csrf_token %}
<input type="hidden" name="msg_id" value="{{i.id}}">
<input class='btn btn-success buttonspace' type="submit" value="Select">
</form>
我正在 运行ning classed 基于 django 的视图。很奇怪我的 post 方法没有采用 class.
中的其他方法我的 get_context_data 工作并且可以接受并打印 self.get_msg(),但是,当我 运行 它时,我的 post 方法将我带到一个页面找不到 404 页面,因为我在 post 函数中包含了 self.get_msg() 函数。我需要 post 函数来接收一些参数,以便将其保存在模型中。
有谁知道为什么会这样,我该如何解决?欢迎任何建议。
谢谢
class OpeningConfirmApp(LoginRequiredMixin, FormMixin, TemplateView):
template_name = 'opening/opening_confirm_app.html'
form_class = PriceForm
def get_msg(self, *args, **kwargs):
msg_id = self.request.GET.get("msg_id")
msg = get_object_or_404(Message, pk=msg_id)
parent_msg_id = msg.parent_id
msg = get_object_or_404(Message, pk=parent_msg_id)
return msg
def get_context_data(self, *args, **kwargs):
context = super(OpeningConfirmApp, self).get_context_data(*args, **kwargs)
#working
print self.get_msg()
return context
def post(self, request, *args, **kwargs):
#not working
print self.get_msg()
form = self.get_form()
if form.is_valid():
price = form.cleaned_data.get("price")
return self.form_valid(form)
def get_success_url(self):
msg = self.get_msg()
messages.success(self.request, "Your application has been sent.")
return reverse('MessageDetail', kwargs={'pk': msg.id})
下面是我的 html 如果有帮助的话。
<br>
<form action="{% url 'OpeningConfirmApp' %}" method="get" style="display: inline">
<input type="hidden" name="msg_id" value="{{object.id}}">
<input class='btn btn-success' type="submit" value="Apply for Opening">
</form>
<br>
您的 get_msg()
方法尝试从 request.GET
获取 msg_id
。此密钥不会在 POST 请求中设置,因此 msg_id
将是 None
,因此 get_object_or_404
将加注。
此处的规范解决方案是将 "msg_id" 作为 url 的一部分而不是作为 GET 参数传递。你的 url 正则表达式看起来像
r"/msg/something/(?P<msg_id>\d+)/$",
无论请求方法如何,您都会在视图的 kwargs 中得到 "msg_id"。
如果你真的必须将它作为请求参数,那么你需要将它传递回实际发布到你的视图的表单(你在这里只显示了一个执行 GET 请求的表单)。
您不希望您的表单具有 post 方法而不是 get 方法吗?
<form action="{% url 'OpeningConfirmApp' %}" method="POST" style="display: inline">
否则它根本不会到达您的 POST 方法。 (这可能就是为什么您看不到 post 方法的打印语句的原因)。
正如 Bruno 所说,您的 get_msg 方法是从 request.GET 而不是 request.POST 获取数据,因此您需要同时检查两者。 (Django 曾经提供 request.REQUEST 方法来访问 GET 和 POST 字典,但我看到它已从 1.10 开始被删除。)
我在研究了 bruno desthuilliers 给出的提示后找到了解决方案。这个解决方案需要我做另一个 url 和功能。新函数重定向到我的主要函数来执行 posting.
我必须添加另一个url.py来收集基于第一个url中pk的msg_id。
url(r'^messagedetail/(?P<pk>[0-9]+)/appoffconf$', AppOffConf, name='AppOffConf'),
并向 view.py 添加另一个功能来记录会话,然后将其重定向到我的主要功能。
def AppOffConf(request, pk):
request.session["msg_id"] = pk
return redirect("OpeningConfirmApp")
这样它可以检索 msg_id 而不需要同时使用 post 和 get(这会使我的提交变得复杂,wobbily_col 提到了 request.REQUEST 方法来访问 GET POST 词典已在我正在使用的 1.10 中删除)因此,我执行 post 的主要功能将更改为 self.request.session.get("msg_id") 而不是 self.request.GET.get("msg_id")
class OpeningConfirmApp(LoginRequiredMixin, FormMixin, TemplateView):
template_name = 'opening/opening_confirm_app.html'
form_class = PriceForm
def get_msg(self, *args, **kwargs):
#changed from - msg_id = self.request.GET.get("msg_id")
msg_id = self.request.session.get("msg_id")
msg = get_object_or_404(Message, pk=msg_id)
parent_msg_id = msg.parent_id
msg = get_object_or_404(Message, pk=parent_msg_id)
return msg
def get_context_data(self, *args, **kwargs):
context = super(OpeningConfirmApp, self).get_context_data(*args, **kwargs)
#working
print self.get_msg()
return context
def post(self, request, *args, **kwargs):
#working now
print self.get_msg()
form = self.get_form()
if form.is_valid():
price = form.cleaned_data.get("price")
return self.form_valid(form)
def get_success_url(self):
msg = self.get_msg()
messages.success(self.request, "Your application has been sent.")
return reverse('MessageDetail', kwargs={'pk': msg.id})
html 更改为将表单按钮定向到第一个 url/function,然后它将被重定向到我的主要功能以执行 posting。
<form action='appoffconf' method="post" style="display: inline">{% csrf_token %}
<input type="hidden" name="msg_id" value="{{i.id}}">
<input class='btn btn-success buttonspace' type="submit" value="Select">
</form>