Работа с формами с помощью AJAX и POST запросов в Django

265
16 мая 2018, 11:50

Работаю с Django. Написал парсер, который собирает подписчиков в инстаграме. Парсер запускается на сайте при вводе в форму желаемый username. То есть ввели username, отправили форму, в функции во views получили введенный username и передали параметром в функцию парсера. Понятно, что пока парсер работает, идёт перезагрузка страницы, так как request.POST. Хочу сделать с помощью ajax. Как передавать так же username через форму, но при этом, чтобы работало ajax'om? Я написал программу, но она не работает. Уверен, что там косяки, но представлю свой код, чтобы вы поняли, что именно я хотел бы сделать.

base html

{% load staticfiles %}
<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <!-- Bootstrap core JavaScript -->
    <script src="{% static 'vendor/jquery/jquery.min.js' %}"></script>
    <script src="{% static 'vendor/bootstrap/js/bootstrap.bundle.min.js' %}"></script>
    {% block script %}{% endblock %}
</head>
<body>
<main>
    <div class="container">
        {% block content %}{% endblock %}
    </div>
</main>
</body>
</html>

login.html

{% extends 'authapp/base.html' %}
{% load staticfiles %}
{% block script %}
    <script src="{% static 'scripts/parser-ajax.js' %}"></script>
{% endblock %}
{% block content %}
    <form method="post">
        {% csrf_token %}
        {{ unloading_list_form.as_p }}
        <input type="submit" value="Отправить" class="btn_get_followers">
    </form>
{% endblock %}

В этой функции мне нужно получить username_data, чтобы передать параметром в parser.get_followers()

views.py

from django.shortcuts import render, HttpResponseRedirect
from django.urls import reverse
from .forms import UnloadingListForm
# Create your views here.
def login(request):
    if request.method == 'POST':
        unloading_list_form = UnloadingListForm(request.POST)
        if unloading_list_form.is_valid():
            if request.is_ajax():
                username_data = request.GET.get('username', None)
                parser = Parser()
                parser.get_followers(username_data)
                return HttpResponseRedirect(reverse('authapp:login'))
    else:
        unloading_list_form = UnloadingListForm()
    content = {
        'unloading_list_form': unloading_list_form
    }
    return render(request, 'authapp/login.html', content)

models.py

from django.db import models
# Create your models here.
class UnloadingList(models.Model):
    username = models.CharField(max_length=64)

forms.py

from django.forms import ModelForm
from .models import UnloadingList

class UnloadingListForm(ModelForm):
    class Meta:
        model = UnloadingList
        fields = ['username']

parser-ajax.js

window.onload = function () {
    $('.btn_get_followers').on('click', function () {
        $.ajax({
            url: '/login/',
            type: 'post',
            success: function () {
                alert('Сбор завершен.');
            }
        });
    });
};

urls.py

from django.urls import path
import authapp.views as authapp
app_name = 'authapp'
urlpatterns = [
    path('login/', authapp.login, name='login')
]
Answer 1

Проблема решена.

views.py

from django.shortcuts import render, HttpResponse
from .forms import UnloadingListForm
from authapp.management.scripts.parser import Parser
from .models import UserFollowersList

# Create your views here.
def login(request):
    unloading_list_form = UnloadingListForm()
    content = {
        'unloading_list_form': unloading_list_form
    }
    return render(request, 'authapp/login.html', content)

def get_followers(request):
    if request.method == 'POST':
        username = request.POST['username']
        parser = Parser()
        driver = parser.init_driver()
        profile_users = parser.get_followers(driver, username)
        for profile_user in profile_users:
            user_followers_list = UserFollowersList(follower_name=profile_user)
            user_followers_list.save()
        driver.quit()
        return HttpResponse('')

parser-ajax.js

window.onload = function () {
    $('.btn_get_followers').on('click', function (e) {
        e.preventDefault();
        $.ajax({
            type: 'POST',
            url: '/get_followers/',
            data: {
                username: $('#id_username').val(),
                csrfmiddlewaretoken: $("input[name=csrfmiddlewaretoken]").val()
            },
            success: function () {
                console.log('done');
                alert('DONE');
            }
        });
    });
};

urls.py в папке самого приложения

from django.contrib import admin
from django.urls import path, include
import authapp.views as authapp
urlpatterns = [
    path('admin/', admin.site.urls),
    path('auth/', include('authapp.urls', namespace='auth')),
    path('get_followers/', authapp.get_followers, name='get_followers')
]
READ ALSO
Ошибка в module.js

Ошибка в module.js

Пытаюсь выполнить команду node generate" но вылазит ошибка:

364
Скобки у модуля

Скобки у модуля

Я понимаю зачем нужен модуль и вобще зачем нужна инкапсуляцияОднако никак не могу понять чем обусловлен его синтаксис (function(){ код })()

226
Фильтр выдающий результаты из массива

Фильтр выдающий результаты из массива

Хочу сделать что-то вроде фильтра, однако не с сортировкой блоков, а именно вставкой данных из массиваТо есть, изначально блок

344
Cloudinary Uploading Img [требует правки]

Cloudinary Uploading Img [требует правки]

I have situation where I need to create file uploading using Cloudinary I need to disabled file resizeing and set custom height and weight

254