这里有新的Django用户。 我试图在GET请求时限制对Django的success_url()的访问。我意识到我并不是第一个提出这个问题的人,但是,我特意尝试与Django的基于类的通用视图一起实现这一点。通用视图看起来更清晰,更快速,更具惯用性。我希望尽可能多地使用它们,除非它们完全不适合这项工作。
基本上,我正在为非用户创建一个简单的联系表单,这些用户只想在不创建帐户的情况下向我发送消息。我创建了一个联系人应用程序来处理这些类型的联系人。我创建了一个ModelForm,我使用带有Django的FormView的contact.html进行渲染。在一个人提交表单后,他们会收到一封很酷的感谢信息,用thanks.html呈现,它有自己的网址。
但是如果他们发布联系表格,我只希望他们看到感谢信息。目前,您可以访问我的网站并输入' / contact / thanks /',无论您是否提交了表单,都会显示我的thanks.html。 Django的success_url显然默认为GET请求。
以下是我的观点:
class MyContact(FormView):
template_name = 'contact.html'
form_class = ContactForm
success_url = 'thanks'
这是我的表格:
ContactForm(forms.ModelForm):
class Meta:
model = Contact
fields = ['email_address', 'message_body']
这是&contact.html中的html表单:
<form action="" method="POST">{% csrf_token %}
{{ form|crispy }}
<button type="submit" class="send btn btn-secondary">Send Message</button>
</form>
我的第一个想法是用这样的require_POST()装饰器装饰我的联系人应用程序网址:
urlpatterns = [
url(r'^thanks/$', require_POST(views.ThanksPageView.as_view()), name='thanks'),
这不起作用,因为Django的success_url()默认为GET请求。
最常用的方法是什么?由于Django是一个包括电池&#39;框架,我不想使用&#39; duck-tape&#39;,这意味着我不想在我的视图或网址中实现任何ad-hoc逻辑。
很抱歉,如果我在文档或问题档案中遗漏了任何内容。
答案 0 :(得分:2)
由于您要求采用惯用法,我会考虑消息框架,特别是SuccessMessageMixin。这样您就可以将成功消息添加到例如联系表单本身和/thanks/
页面的url-pattern不是必需的。