Ajax POST表单到Django数据问题

时间:2013-03-09 22:59:26

标签: ajax django forms post login

对此感到沮丧几天,并且想知道是否有人可以提供帮助。我是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

1 个答案:

答案 0 :(得分:1)

这些是错误(并非全部,我认为还有更多)我在测试代码时看到了:

  1. 如果您未在模板中使用AuthenticationForm(),那么如何登录?您在模板中的表单代码是不同的。
  2. 你没有把方法=&#34; POST&#34;在您的表单中导致GET响应而不是POST。
  3. 您忘记将{%csrf_token%}放入模板表格
  4. 在views.py中, user = authenticate(标识=标识,密码=密码)必须 user = authenticate(用户名=标识,密码=密码) < / LI>
  5. 在您的forms.py中, user = authenticate(标识=标识,密码=密码)必须 user = authenticate(用户名=标识,密码=密码) < / LI>
  6. 您的ajax代码无效,这就是为什么您无法获得错误的原因。我想你在ajax中遗失了一些东西。
  7. 要获取引发错误的详细信息:

    error: function(ts){
        //console.log(errorThrown);
        //alert('Error');
        alert(ts.responseText);
        }
    
  8. 您的ajax数据必须包含&#39;&#39;:

    data: {
        'csrfmiddlewaretoken': '{{csrf_token}}',
        'identification': $("#id_identification").val(),
        'password': $("#id_password").val(),
        },
    
  9. 您不必像这样详细说明您的网址

    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",
    
  10. 还有更多错误,直到现在我无法成功登录。