多个视图中的一个Django表单具有继承的Post请求

多个视图中的一个Django表单具有继承的Post请求,django,django-models,django-forms,django-templates,django-views,Django,Django Models,Django Forms,Django Templates,Django Views,我还没有找到任何关于这方面的明确文档,但我有一个联系人表单,我需要在多个视图的侧栏中使用它。目前我的代码是脏的,因为我在多个视图中重复下面的代码片段来处理表单。有没有办法将Post请求放在可以继承的模板中 看法 谢谢您的帮助。现在,我假设您在运行每个视图时执行与下面相同的操作: def contact(request): # First you choose the form. form_class = ContactForm # Then you want to kn

我还没有找到任何关于这方面的明确文档,但我有一个联系人表单,我需要在多个视图的侧栏中使用它。目前我的代码是脏的,因为我在多个视图中重复下面的代码片段来处理表单。有没有办法将Post请求放在可以继承的模板中

看法


谢谢您的帮助。

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

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
文件的开头创建你自己的函数,让它一次又一次地变短

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)

但是,我建议您使用,因为它们可以作为方法处理任何请求类型。因此,我将
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")

我不知道您所说的继承表单的真正含义,但我认为基于类的视图可能会对您有所帮助但如果您的意思是不想总是重复上面的代码,这可能会对您有所帮助:太棒了!!我挂了几分钟的电话,然后意识到我必须把
{'form':ContactForm}
放在我的
联系人
函数中。你能把代码共享作为答案让我接受为正确吗?另外,如果您不介意的话,您能指出一些关于代码的
(req,msg)
部分的文档吗?我搜索了一下,但看不出这是从哪里来的。再次感谢!!这不是文件上的东西。您只需创建一个函数,并将
请求
消息
表单类
作为参数传递。这就是全部。我过一会儿再回答。
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")