1

数日間これに不満を感じており、誰かが助けてくれるかどうか疑問に思っていました. 私は Ajax が初めてで、Django (Django Userena) にログインするためにログインフォームからデータを投稿しようとしています。ただし、データを投稿しようとすると、alert() で [オブジェクト オブジェクト] としてデータにエラーが表示されます。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)

認証フォーム

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
4

1 に答える 1

1

これらは、コードをテストしたときに表示されるエラーです (すべてではなく、他にもあると思います)。

  1. テンプレートで AuthenticationForm() を使用しなかった場合、どうすればログインできますか。テンプレート内のフォーム コードは異なります。
  2. フォームに method="POST" を配置しなかったため、POST ではなく GET 応答が返されました。
  3. テンプレートフォームに {% csrf_token %} を入れ忘れました
  4. あなたのviews.pyでは、user = authenticate(identification=identification, password=password)はuser = authenticate(username=identification, password= password) でなければなりません
  5. forms.py では、user = authenticate(identification=identification, password=password)user = authenticate(username=identification, password= password) である必要があります。
  6. あなたの ajax コードは効果がないため、エラーがスローされません。あなたのajaxに何かが欠けていると思います。
  7. スローされたエラーの詳細を取得するには:

    error: function(ts){
        //console.log(errorThrown);
        //alert('Error');
        alert(ts.responseText);
        }
    
  8. ajax データには '' が必要です:

    data: {
        'csrfmiddlewaretoken': '{{csrf_token}}',
        'identification': $("#id_identification").val(),
        'password': $("#id_password").val(),
        },
    
  9. このように URL を詳しく説明する必要はありません

    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",
    

さらにエラーが発生し、今まで正常にログインできませんでした。

于 2013-03-10T01:48:33.587 に答える