urls.py
from django.contrib import admin
from django.urls import path
from ajax_app import views
urlpatterns = [
path('', views.index, name='index'),
path('ajax_form/', views.ajax_submit, name='ajax_submit'),
]
forms.py
from django.utils.translation import ugettext_lazy as _
from django import forms
class MyForm(forms.Form):
name = forms.CharField(
label=_('Name'),
max_length=255,
required=True,
widget=forms.TextInput(
attrs={'class': 'form-control', 'name': 'name', }
)
)
email = forms.EmailField(
label=_('Email'),
max_length=255,
required=True,
widget=forms.EmailInput(
attrs={'class': 'form-control', 'name': 'email', }
)
)
def clean_email(self):
email = self.cleaned_data['email']
# Validation Example
if email != 'hi@hi.com':
raise forms.ValidationError("Email already exists.")
return email
view.py
from django.shortcuts import render
from django.http import QueryDict
from .forms import *
def index(request):
"""
Show Inital Form
:param request:
:return:
"""
form = MyForm()
return render(request, 'ajax_app/index.html', {'form': form})
def ajax_submit(request):
"""
Ajax call
:param request:
:return:
"""
if request.method == 'POST':
form_data = QueryDict(request.POST['form'].encode('ASCII'))
form = MyForm(form_data)
if form.is_valid():
name = form.cleaned_data.get('name', None)
# Do some here
return render(request, 'ajax_app/form.html', {'form': form})
form.html
<div class="form-group {% if form.name.errors %}has-error{% endif %}">
{{ form.name.label_tag }}
{{ form.name }}
{% if form.name.help_text %}
<span class="help-block">{{ form.name.help_text }}</span>
{% endif %}
{% for error in form.name.errors %}
<span class="help-block">{{ error }}</span>
{% endfor %}
</div> <!-- form-group -->
<div class="form-group {% if form.email.errors %}has-error{% endif %}">
{{ form.email.label_tag }}
{{ form.email }}
{% if form.email.help_text %}
<span class="help-block">{{ form.email.help_text }}</span>
{% endif %}
{% for error in form.email.errors %}
<span class="help-block">{{ error }}</span>
{% endfor %}
</div> <!-- form-group -->
или
<table>
{{ form.as_table}}
</table>
index.html
...
<h3>Add Data</h3>
<form id="addUser" action="{% url 'ajax_submit' %}" method="POST">
{% csrf_token %}
<div class="form-container">
{% include "ajax_app/form.html" %}
</div>
<button type="submit" class="btn btn-primary">Submit</button>
</form>
...
Ajax
Этот скрипт должен быть выполнен после загрузки jquery
$("form#addUser").submit(function(e) {
e.preventDefault(); // <--
var csrftoken = jQuery('[name=csrfmiddlewaretoken]').val();
var form = $("#addUser");
$.ajax({
method: form.attr("method"),
url: form.attr("action"),
data: {
csrfmiddlewaretoken: csrftoken,
form: form.serialize()
},
dataType: 'Html',
success: function (data) {
$('.form-container').html(data); // <--
}
});