Как включить Ajax в CreateView?
У меня есть CreateView... и он отлично работает в традиционном смысле. Я пытаюсь преобразовать его по существу в AJAX для отправки, потому что пользователь может прикреплять файлы к форме, и я пытаюсь избежать ошибки отправки формы, основанной на ошибках пользователя. Вот мой CreateView...
class CreateProcedureView(LoginRequiredMixin,CreateView):
model = NewProcedure
form_class = CreateProcedureForm
template_name = 'create_procedure.html'
def form_valid(self, form):
instance = form.save()
def post(self, request, *args, **kwargs):
if "cancel" in request.POST:
return HttpResponseRedirect(reverse('Procedures:procedure_main_menu'))
else:
self.object = None
user = request.user
form_class = self.get_form_class()
form = self.get_form(form_class)
file_form = NewProcedureFilesForm(request.POST, request.FILES)
files = request.FILES.getlist('file[]')
if form.is_valid() and file_form.is_valid():
procedure_instance = form.save(commit=False)
procedure_instance.user = user
procedure_instance.save()
list=[]
for f in files:
procedure_file_instance = NewProcedureFiles(attachments=f, new_procedure=procedure_instance)
procedure_file_instance.save()
return self.form_valid(form)
else:
form_class = self.get_form_class()
form = self.get_form(form_class)
file_form = NewProcedureFilesForm(request.POST, request.FILES)
return self.form_invalid(form)
Как уже было сказано, он прекрасно работает так, как есть. Я пытаюсь понять, как мне лучше всего преобразовать это в подход типа AJAX? Вот что у меня есть на данный момент...
Вот мой AJAX...
$(document).ready(function (){
$("#forms").on('submit', function(event) {
event.preventDefault();
var newprocedure = '{{ newprocedure }}';
$.ajax({
type: "POST",
url: "{% url 'Procedures:ajax_posting' %}",
data:{
newprocedure:newprocedure,
'csrfmiddlewaretoken': $('input[name=csrfmiddlewaretoken]').val()
},
datatype:'json',
success: function(data) {
if (data['success'])
alert("successfully added to favorites")
}
});
});
});
А вот представление, которое я пытаюсь вызвать...
def ajax_posting(request):
data = {'success': False}
form = CreateProcedureForm(request.user,request.POST)
if request.method=='POST':
data['success'] = True
else:
print(form.errors)
return JsonResponse(data)
Я вижу, что он вызывает представление, потому что print(form.errors) показывает мне кучу ошибок для обязательных полей, и я ожидал этого, потому что форма, похоже, не обрабатывается после того, как я заполняю ее и нажимаю submit, абсолютно ничего не происходит.
Заранее спасибо за любые мысли. Я новичок во всей этой истории с AJAX.
Для обработки вы можете использовать свой предыдущий вид. Его нужно только немного подправить.
При отправке вы хотите установить вашу форму как JS FormData в вашем ajax скрипте
data: FormData(forms[0])
Вы можете получить данные с помощью django таким образом
data = request.POST
И затем инстанцируйте его с вашей формой django для обработки таким образом
form = RegForm(data=data)