Как обрабатывать данные формы POST с Django (refre sh избегается)? - PullRequest
1 голос
/ 18 марта 2020

Я пытаюсь сохранить данные формы в базе данных, используя Django. Обновление после нажатия кнопки «Отправить» исключено с помощью:

scripts.py

var form = document.getElementById("mail_form_id");
function handleForm(event) { event.preventDefault(); } 
form.addEventListener('submit', handleForm);



function send_mailform(){
    console.log("cal")
    var http = new XMLHttpRequest();
    http.open("POST", "", true);
    http.setRequestHeader("Content-type","application/x-www-form-urlencoded");
    var params = "search=" + document.getElementById('mail_input').value; 
    http.send(params);
    http.onload = function() {
        alert(http.responseText);
    }
}
document.getElementById("mail_send_btn").addEventListener('click', send_mailform, false);

views.py

    #Mail check
    if request.POST:
        Marketingform = Marketingforms(request.POST)
        if Marketingform.is_valid():
            receiver_mail = Marketingform.cleaned_data['receiver_mail']

            p = mail_receiver(receiver_mail=receiver_mail)
            p.save()
            print("correct")

views.py

class mailForm(forms.ModelForm):
    class Meta:
        model = mail_receiver
        fields =[
            'receiver_mail',
        ]
        widgets = {
            'receiver_mail': forms.EmailInput(attrs={ 'id':'mail_input', 'name':'mail_input'}),
        }

Как получить значение params в django views.py ?

1 Ответ

1 голос
/ 18 марта 2020

Сначала ваш ajax запрос не будет работать из-за токена csrf. у вас должен быть заголовок запроса с именем: 'X-CSRFToken' и значением csrftoken cook ie, который находится в файлах cookie браузера. Вы должны получить значение csrftoken cook ie и установить его в качестве значения заголовка.
Заголовок должен выглядеть следующим образом:
http.setRequestHeader ('X-CSRFToken', getCook ie ('csrftoken') );
И getCook ie () должна быть функцией для получения значения cook ie на основе его имени. Django имеет чистое do c об этом:
https://docs.djangoproject.com/en/3.0/ref/csrf/
И ответ на ваш вопрос состоит в том, что объект запроса содержит данные поста, и вы можете иметь их как:
request.POST.get ('param_name') Это вернет None, если param_name не существует. Также лучше проверить как:
если request.is_ ajax (): вместо если request.POST:

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