【问题标题】:One Django Form in Multiple Views with Inherited Post Request具有继承的发布请求的多个视图中的一个 Django 表单
【发布时间】:2016-04-09 21:50:27
【问题描述】:

我还没有找到任何明确的文档,但我有一个联系表格,我需要在多个视图的侧边栏中使用它。目前我的代码很脏,因为我在多个视图中重复下面的代码 sn-p 来处理表单。有没有办法将 Post Request 放在可以继承的模板中?

查看

def contact(request):
    form_class = ContactForm

    if request.method == 'POST':
        form = form_class(data=request.POST)
        messages.add_message(request, messages.SUCCESS, 'Thank you, we have received your message.')

        if form.is_valid():
        ...

感谢您的帮助。

【问题讨论】:

  • 我不知道你说的真正是什么意思继承一个表单,但我认为基于类的视图可能会对你有所帮助。 |但如果您的意思是您并不总是想重复上面的代码,这可能会对您有所帮助:codeshare.io/ZN7nx
  • 太棒了!!我挂断了几分钟,然后意识到我必须将{'form': ContactForm} 放入我的contact 函数中。您可以将代码共享作为答案让我接受吗?另外,如果您不介意,您能否指出一些关于代码的(req, msg) 部分的文档?我搜索但看不到这是从哪里来的。再次感谢!!
  • 这不是文档中的内容。您只需创建一个函数并将requestmessageform_class 作为参数传递。就这样。稍后我会回答。

标签: django django-models django-forms django-templates django-views


【解决方案1】:

现在,我假设您在运行每个视图时执行与以下相同的操作:

def contact(request):
    # First you choose the form.
    form_class = ContactForm

    # Then you want to know if request is POST type
    if request.method == 'POST':
        # You take the form data from given POST
        form = form_class(data=request.POST)
        # You add message to messages.
        messages.add_message(request, messages.SUCCESS, 'Thank you, we have received your message.')

如果您一遍又一遍地做同样的事情,您可以在任何应用程序的 views.py 文件的开头创建自己的函数以使其简短,并一遍又一遍地创建 not to repeat yourself

def take_message(request, form, messages, message):
    if request.METHOD == "POST":
        # I'm reinitializing <form> variable here.
        form = form(data=request.POST)
        # That <message> variable below must be a string, then you can dynamically pass your message.
        messages.add_message(request, messages.SUCCESS, message)

然后在你的视图中使用它:

def contact(request):
    take_message(request, ContactForm, messages, "Thanks, we got your message.")
    # And the rest here.

但是,我建议您使用class-based views,因为它们可以将任何请求类型作为方法处理。因此,我将 take_message 方法更改如下:

def take_message(request, form, messages, message):
    # I'm reinitializing <form> variable here.
    form = form(data=request.POST)
    # That <message> variable below must be a string, then you can dynamically pass your message.
    messages.add_message(request, messages.SUCCESS, message)

那么,我的看法如下:

from django.views.generic import TemplateView
# And any other important imports.

# ...

class ContactView(TemplateView):
    template_name = "contact.html" # This is your template.

    def get(self, request):
        # Do things when the method is GET. Like, viewing current messages in a hypothetical admin template.

    def delete(self, request):
        # Do things when the method is DELETE. Don't forget to use authentication here, so only superuser can delete messages.

    def post(self, request):
        # Do things when the method is POST.
        # I'm assuming anonymous users can send messages, so there's no need for authentication here.
        take_message(request, ContactForm, messages, "Thanks you, we got your message.")
        # Other things to do.

# urls.py
url(r"^contact/$", ContactView.as_view(), name="contact-page")

【讨论】:

    猜你喜欢
    • 2012-05-23
    • 1970-01-01
    • 2022-01-23
    • 2016-03-22
    • 2011-02-19
    • 1970-01-01
    • 2017-02-26
    • 2015-08-03
    • 2020-03-03
    相关资源
    最近更新 更多