Добавьте одну или несколько форм по всему миру и отправьте, используя Ajax - PullRequest
0 голосов
/ 12 ноября 2018

У меня есть одна форма, которая появляется в нижней части сайта. Я отправляю эту форму, используя 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 голосов
/ 12 ноября 2018

Ваш 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/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...