对此感到沮丧几天,并且想知道是否有人可以提供帮助。我是Ajax的新手并尝试从登录表单发布数据以登录Django(Django Userena)。但是,当我尝试发布数据时,alert()会将数据中的错误显示为[object object]。我甚至看不到网络错误代码,因为POST在运行之前就被取消了。
有没有办法只发送数据,而不是我认为它发送的整个JSON数组,或者我需要在Django视图后端解析它。完成此代码的最佳方法是什么?非常感谢你!
以下是相关代码:
Ajax代码:
$('#login').submit(function(){
$.ajax({
url: 'http://127.0.0.1:8000/accounts/signin/',
type: 'POST',
data: {
csrfmiddlewaretoken: '{{csrf_token}}',
identification: $("#id_identification").val(),
password: $("#id_password").val(),
},
success: function() {
alert('Test');
$('#datadisplay').append("<h2>It worked</h2>");
},
error: function(errorThrown){
console.log(errorThrown);
alert('Error');
alert(errorThrown);
}
});
});
Index.html上的表格
<form name="login" id="login" action="">
<fieldset>
<label for="id_identification">Email or username</label>
<input class="required" id="id_identification" maxlength="75" name="identification" type="text" />
<label for="id_password">Password</label>
<input class="required" id="id_password" name="password" type="password" />
<input type="submit" name="submit" class="loginbutton" value="Login" />
</fieldset>
</form>
来自Django-Userena的views.py
@secure_required
def signin(request, auth_form=AuthenticationForm,
template_name='userena/signin_form.html',
redirect_field_name=REDIRECT_FIELD_NAME,
redirect_signin_function=signin_redirect, extra_context=None):
"""
Signin using email or username with password.
Signs a user in by combining email/username with password. If the
combination is correct and the user :func:`is_active` the
:func:`redirect_signin_function` is called with the arguments
``REDIRECT_FIELD_NAME`` and an instance of the :class:`User` who is is
trying the login. The returned value of the function will be the URL that
is redirected to.
A user can also select to be remembered for ``USERENA_REMEMBER_DAYS``.
:param auth_form:
Form to use for signing the user in. Defaults to the
:class:`AuthenticationForm` supplied by userena.
:param template_name:
String defining the name of the template to use. Defaults to
``userena/signin_form.html``.
:param redirect_field_name:
Form field name which contains the value for a redirect to the
succeeding page. Defaults to ``next`` and is set in
``REDIRECT_FIELD_NAME`` setting.
:param redirect_signin_function:
Function which handles the redirect. This functions gets the value of
``REDIRECT_FIELD_NAME`` and the :class:`User` who has logged in. It
must return a string which specifies the URI to redirect to.
:param extra_context:
A dictionary containing extra variables that should be passed to the
rendered template. The ``form`` key is always the ``auth_form``.
**Context**
``form``
Form used for authentication supplied by ``auth_form``.
"""
form = auth_form()
if request.method == 'POST':
form = auth_form(request.POST, request.FILES)
if form.is_valid():
#identification, password, remember_me = (form.cleaned_data['identification'],
#form.cleaned_data['password'],
#form.cleaned_data['remember_me'])
identification, password = (form.cleaned_data['identification'], form.cleaned_data['password'])
user = authenticate(identification=identification,
password=password)
if user.is_active:
login(request, user)
if remember_me:
request.session.set_expiry(userena_settings.USERENA_REMEMBER_ME_DAYS[1] * 86400)
else: request.session.set_expiry(0)
if userena_settings.USERENA_USE_MESSAGES:
messages.success(request, _('You have been signed in.'),
fail_silently=True)
# Whereto now?
redirect_to = redirect_signin_function(
request.REQUEST.get(redirect_field_name), user)
return HttpResponseRedirect(redirect_to)
else:
return redirect(reverse('userena_disabled',
kwargs={'username': user.username}))
if not extra_context: extra_context = dict()
extra_context.update({
'form': form,
'next': request.REQUEST.get(redirect_field_name),
})
return ExtraContextTemplateView.as_view(template_name=template_name,
extra_context=extra_context)(request)
AuthenticationForm
class AuthenticationForm(forms.Form):
"""
A custom form where the identification can be a e-mail address or username.
"""
identification = identification_field_factory(_(u"Email or username"),
_(u"Either supply us with your email or username."))
password = forms.CharField(label=_("Password"),
widget=forms.PasswordInput(attrs=attrs_dict, render_value=False))
remember_me = forms.BooleanField(widget=forms.CheckboxInput(),
required=False,
label=_(u'Remember me for %(days)s') % {'days': _(userena_settings.USERENA_REMEMBER_ME_DAYS[0])})
def __init__(self, *args, **kwargs):
""" A custom init because we need to change the label if no usernames is used """
super(AuthenticationForm, self).__init__(*args, **kwargs)
# Dirty hack, somehow the label doesn't get translated without declaring
# it again here.
self.fields['remember_me'].label = _(u'Remember me for %(days)s') % {'days': _(userena_settings.USERENA_REMEMBER_ME_DAYS[0])}
if userena_settings.USERENA_WITHOUT_USERNAMES:
self.fields['identification'] = identification_field_factory(_(u"Email"),
_(u"Please supply your email."))
def clean(self):
"""
Checks for the identification and password.
If the combination can't be found will raise an invalid sign in error.
"""
identification = self.cleaned_data.get('identification')
password = self.cleaned_data.get('password')
if identification and password:
user = authenticate(identification=identification, password=password)
if user is None:
raise forms.ValidationError(_(u"Please enter a correct username or email and password. Note that both fields are case-sensitive."))
return self.cleaned_data
答案 0 :(得分:1)
这些是错误(并非全部,我认为还有更多)我在测试代码时看到了:
要获取引发错误的详细信息:
error: function(ts){
//console.log(errorThrown);
//alert('Error');
alert(ts.responseText);
}
您的ajax数据必须包含&#39;&#39;:
data: {
'csrfmiddlewaretoken': '{{csrf_token}}',
'identification': $("#id_identification").val(),
'password': $("#id_password").val(),
},
您不必像这样详细说明您的网址
url: 'http://127.0.0.1:8000/accounts/signin/',
将导致
"http://127.0.0.1:8000/http://127.0.0.1:8000/accounts/signin/"
一定是
url: '/accounts/signin/',
并且不要忘了把
contentType: "application/json;charset=utf-8",
dataType: "json",
还有更多错误,直到现在我无法成功登录。