Ваш 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 в файле шаблона представления (и формы) следующим образом:
шаблоны / myformtemplate.html
<form action="#" method="post">
{% csrf_token %}
{{ form2 }}
<input type="submit" value="Submit">
</form>
Надеюсь, это поможет вам в вашем проекте.
А что касается токена формы : токен будет автоматически включен в вызов ajax (data: $ ('form'). Serialize (),) при отправке формы. Больше форм на одной странице также не может вызвать проблемы в этом вопросе.
Теперь, Я не совсем понял вторую часть вашего вопроса, касающуюся первого использования созданной Формы "sitewide". Тогда я должен был понять, что вы, возможно, еще глубже не изучали систему шаблонов Django, и именно поэтому вы задаете этот вопрос.
Итак, применяя это представление (с формой и шаблоном) в нижнем колонтитуле вашего сайта:
В вашем приложении шаблоны папка (вы должны создать ее):
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-форму (вместо визуализированной HTML-формы Django) в шаблоне формы, и вы можете отправить эту форму через AJAX в целевое представление из любого места на вашем веб-сайте. Я надеюсь, что вы сможете следовать этой концепции.
Надеюсь, я не понял вас неправильно в этой части ваших вопросов и именно об этом вы хотели спросить. Если у вас есть дополнительные вопросы по поводу того, как включить представление и шаблон «рядом», то вам необходимо изучить систему шаблонов Django, т.е. здесь (есть действительно бесконечные возможности, где вы включаете, а где нет, маленькие представления / шаблоны):
https://docs.djangoproject.com/en/2.1/ref/templates/builtins/