在站点范围内添加一个或多个表单并使用Ajax提交



我有一个表单在页脚中显示为整个站点。我使用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令牌的帮助,并在站点范围内加载/传递表单。

视图中的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>

我希望这能对你的项目有所帮助。

关于表单令牌:该令牌将在表单提交时自动包含在ajax调用(data:$('form'(.serialize(,(中。在一个页面上多个表单也不能真正引起这个问题。

现在,我并没有真正理解您问题的第二部分,首先是关于使用创建的表单"站点范围"。然后我不得不明白,你可能还没有深入研究Django的模板系统,这就是你问这个问题的原因。

因此,在您的网站页脚应用此视图(连同表单和模板(

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

1.您有一个base.html,它是可扩展的(也可以是included模板(,在基本模板中有如下模板标签:

<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/

最新更新