我有一种形式的站点在页脚中出现。我使用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令牌的帮助,并加载/传递整个网站的表单。
答案 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/