在整个网站范围内添加一个或多个表单,然后使用Ajax提交

时间:2018-11-12 08:15:22

标签: ajax django django-forms

我有一种形式的站点在页脚中出现。我使用Ajax提交此表单。

在某些页面上还可以存在其他形式。

通常,我使用CBV进行创建和更新。

class CreateItem(CreateView):
    model = Item
    form_class = ItemForm

   <form action="" method="post">
        {% csrf_token %}
        {{ form.name }}

在这种情况下,我无法使用以上内容。为了查看提交,我有:

class FooterAddView(View):

    def post(self, request):
        if request.is_ajax():
          .....

我需要有关Ajax令牌的帮助,并加载/传递整个网站的表单。

1 个答案:

答案 0 :(得分:1)

您的 post()(现在我也用 get()更新了它),在Class视图中基本上如下所示:

from django.http import HttpResponseRedirect
from django.template.loader import get_template
from django.shortcuts import render
from django.views import View
from django.http import JsonResponse

from .forms import ItemForm

class FooterAddView(View):

    form_class = ItemForm
    # initial = {'key': 'value'}
    template_name = 'myformtemplate.html'

    def get(self, request, *args, **kwargs):
        form = self.form_class() # you can pass the initials here too
        return render(request, self.template_name, {'form2': form})

    def post(self, request, *args, **kwargs):
        if request.is_ajax():
            form = self.form_class(request.POST)
            if form.is_valid():
                # <process form cleaned data>
                data = form.cleaned_data

                # then save
                form.save()
                return JsonResponse(data)
                # or return HttpResponseRedirect('/success/')                    
            else:
                form = self.form_class()
                print(form.errors)
                # return form.errors

        form = self.form_class()
        return render(request, self.template_name, {'form2': form})

您将像这样在视图(和表单)的模板文件中提供csrf令牌:

templates / myformtemplate.html

<form action="#" method="post">
    {% csrf_token %}
    {{ form2 }}
    <input type="submit" value="Submit">
</form>

我希望这可以为您的项目提供帮助。

关于 form令牌:在提交表单时,该令牌将自动包含在ajax调用中(数据:$('form')。serialize(),)。一页上的更多表格也不会真正导致此问题的出现。

现在,我首先真的不理解您的问题的第二部分,即有关使用创建的“站点范围内”表单的问题。然后我必须了解到,您可能尚未深入研究Django的模板系统,这就是为什么您要问这个问题。

因此,在您的网站页脚应用此视图(带有表单和模板):

在您的应用程序的 templates 文件夹中(您必须创建它):

1。。您有一个 base.html ,它是可扩展的(也可以在其中包含个模板) ),并在基本模板中添加如下所示的模板标签:

<body>
{% block content %} {% endblock content %}
{% block footer %}{% include "myformtemplate.html" %}{% endblock footer %}
</body>

您可以在每个页面上使用您的内容模板扩展此base.html模板。

2。。然后,您将为表单创建的模板包含在基本模板的页脚区

类似于 myformtemplate.html中的简单表单模板:

<div>
<form action="#" method="post">
    {% csrf_token %}
    {{ form2 }}    
    <button type="button" name="myformbutton" id="myform2">Submit me</button>
</form>
</div> 

<script>
var $j = jQuery.noConflict();
$j( document ).ready(function() {
    $j('#myform2').on('click', function (e){
        e.preventDefault();
        $j.ajax({
            type: 'POST',
            url:'/newitem/', // the url that is defined in urls.py for the FooterAddView
            data: $j('form').serialize(),
            success: function(){
                alert('created');
            },
            error: function(response){
                alert('not submitted');
                console.log(response);
            }
        })
    })
});
</script> 

这样,您的模板(具有上述视图和表单)将位于网站页脚部分中的网站的每个网站上。

重要提示:为了使您的表单在包含表单模板的其他视图中呈现,您也应该在该特定视图中定义表单(例如: form = ItemForm 和呈现部分 {'form2':form} 。例如,如果在同一页面/视图上有更多表单,则应使用“ form2”,并且您的表单可以在任何页面中呈现否则,您可以在表单模板中创建自己的HTML表单(而不是Django呈现的html表单),然后可以通过AJAX将该表单从网站上的任何位置提交到目标视图。我希望​​您可以遵循该概念

希望您在这部分问题上不要误会您,这就是您想要的。如果您对如何包含“站点范围”视图和模板还有更多疑问,则需要进一步研究Django模板系统。在这里(小视图/模板确实存在无穷无尽的可能性,包括: https://docs.djangoproject.com/en/2.1/ref/templates/builtins/