gpt4 book ai didi

jquery - 使用 Ajax jQuery 提交 Django 表单的简单方法

转载 作者:行者123 更新时间:2023-12-03 01:44:38 25 4
gpt4 key购买 nike

我对 Ajax 比较陌生,并且仍在努力掌握所有概念。我尝试研究了一堆有关 Ajax-Django 表单提交的教程,其中大多数都需要 jQuery 表单,这对我来说似乎不是处理表单提交的简单方法。我很难理解这个概念。

我正在尝试编写一些基于ajax的表单提交,用于用户注册、登录、帖子创建和评论。到目前为止,我还没有找到一种方法可以让我更轻松地理解 Ajax 方法的工作原理。

我非常感谢在这方面能得到的任何帮助。

这是我到目前为止所尝试过的。

change_pw.html

{% extends "base.html" %}
{% block title %}Change Password{% endblock %}
{% block head %}Change Password{% endblock %}
{% block content %}
{% include "modal_change_pw.html" %}
{% endblock %}

modal_change_pw.html

<div id="modalchangepw">
<ul style="margin:5px;">
<ul class="thumbnails" style="margin: 0 auto;background: white;">
<div class="thumbnail row-fluid" style="background: white; padding: 10px;width: 97%; -moz-border-radius: 5px;border-radius: 5px;-moz-box-shadow:3px 3px 5px 0px #ccc;-webkit-box-shadow:3px 3px 5px 0px #ccc;box-shadow:3px 3px 5px 0px #ccc;">
<br>
{% if not error == '' %}
<div class="alert alert-error">
<button type="button" class="close" data-dismiss="alert">&times;</button>
{{ error }}
</div>
{% endif %}
{% if not success == '' %}
<div class="alert alert-success">
<button type="button" class="close" data-dismiss="alert">&times;</button>
{{ success }}
</div>
{% endif %}
{% if messages %}
{% for message in messages %}
<div{% if message.tags %} class="alert alert-{{ message.tags }}"{% endif %}>
<button type="button" class="close" data-dismiss="alert">&times;</button>
{{ message|safe }}
</div>
{% endfor %}
{% endif %}
<form id = 'changepw' enctype="multipart/form-data" method="post" action=".">
<p><label for="id_currentpw">Current Password:</label> <input type="password" name="currentpw" id="id_currentpw" /></p>
<p><label for="id_newpw1">New Password:</label> <input type="password" name="newpw1" id="id_newpw1" /></p>
<p><label for="id_newpw2">Re-enter New Password:</label> <input type="password" name="newpw2" id="id_newpw2" /></p>
<input class="btn btn-primary" type="submit" value="submit"/>
{% csrf_token %}
</form>
</div>
</ul>
</ul>
</div>

views.py

def change_pw(request):
user=request.user
error=''
success=''
if request.method == 'POST':
form = ChangePw(request.POST)
if form.is_valid():
currentpw=form.cleaned_data['currentpw']
newpw1=form.cleaned_data['newpw1']
newpw2=form.cleaned_data['newpw2']
if currentpw and newpw1 and newpw2:
if user.check_password(currentpw):
if newpw1==newpw2:
user.set_password(newpw1)
user.save()
success='Password updated!!'
if request.is_ajax() :
messages.success(request, 'Password updated.')
return HttpResponseRedirect ('/changepw/')
else:
return HttpResponseRedirect ('/user/%s/' % user.username)
else:
error='New passwords do not match'
else:
error='Incorrect Current Password'
else:
error='Enter all Password fields to make any changes'
else:
form = ChangePw()
variables = RequestContext(request, {
'form':form,
'error':error,
'success':success
})
if request.is_ajax() :
return render_to_response('modal_change_pw.html', variables)
else:
return render_to_response('change_pw.html', variables)

forms.py

class ChangePw(forms.Form):
currentpw = forms.CharField(
label=u'Current Password',
required=False,
widget=forms.PasswordInput()
)
newpw1 = forms.CharField(
label=u'New Password',
required=False,
widget=forms.PasswordInput()
)
newpw2 = forms.CharField(
label=u'Re-enter New Password',
required=False,
widget=forms.PasswordInput()
)

jQuery

//Change PW
$('#changepw').live('submit', function(event) { // catch the form's submit event
event.preventDefault();
$.ajax({ // create an AJAX call...
data: $(this).serialize(), // get the form data
type: $(this).attr('method'), // GET or POST
url: $(this).attr('action'), // the file to call
success: function(response) { // on success..
$('#modalchangepw').html(response); // update the DIV
}
});
return false;
});

代码现在看起来工作正常。但我的目标是以模式弹出方式处理这些表单,以便用户不必离开他/她当前所在的页面。在模态弹出窗口的情况下,我的表单似乎没有提交值。

最佳答案

AJAX概念与一般表单提交的工作方式没有太大不同。 AJAX 背后的思想是将数据异步提交(传递)到服务器。

它是如何工作的?

对于一般的表单提交,流程是这样的。

User submits a POST request

Server Does the Data Processing

Redirects to a Success or Failure Page

使用ajax,它的工作原理非常相似。

User Submits a form through AJAX

AJAX sends the POST data to the server in the background and waits for a response

Server does the Data Processing

and sends a Response back to AJAX

AJAX sends the response back to the same template where the request was initiated.

现在让我们看一下带有 django View 的简单 Ajax 登录。

views.py

def ajax_login(request):
"""
This view logs a user in using the POST data.
"""

if request.method == 'POST':
data = {}
username = request.POST['username']
password = request.POST['password']
user = authenticate(username=username, password=password)
if (not user is None) and (user.is_active):
login(request, user)
# Set Session Expiry to 0 if user clicks "Remember Me"
if not request.POST.get('rem', None):
request.session.set_expiry(0)
data['success'] = "You have been successfully Logged In"
else:
data['error'] = "There was an error logging you in. Please Try again"
return HttpResponse(simplejson.dumps(data), mimetype="application/json")

在上面的 View 中,我们进行了数据处理并发回了 JSON 响应。 ajax 方法看起来像这样。

function ajaxLogin(){
var dataString = '&username=' + $('input[name=username]').val() +
'&password=' + $('input[name=password]').val() +
$.ajax({
type: "POST",
url: "/ajax_login/",
data: dataString,
success: function(data) {
alert(data);
}
});
return false;
}

在这里,success 方法接收返回的数据并向用户警告

更新

我看到您已经定义了 ajaxPwchange() 方法,但我并没有真正看到您在任何地方调用它,我认为这就是页面仍然刷新的原因。您可以绑定(bind)ajaxPwchange()方法来提交按钮的onclick事件,如下所示。

<input class="btn btn-primary" type="submit" value="submit" onclick="ajaxPwchange();" />

或者在document.ready方法下绑定(bind)它,如下:

$(document).ready(function(){
$('input.btn-primary').click(function(){
ajaxPwchange();
});
});

更新2

div 消失了,因为您直接在以下代码中将 div 的 html 更改为 json 对象。

success: function(response) { // on success..
$('#modalchangepw').html(response); // update the DIV
}

你应该尝试这样的事情:

success: function(response) { // on success..
var jsonData = $.parseJSON(response);
$.each(response, function(){
$('#modalchangepw').append('<div class="message">' + $(this) + '</div>');
});
}

关于jquery - 使用 Ajax jQuery 提交 Django 表单的简单方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14099038/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com