1

私が学校で取り組んでいるWebサイトで、ユーザーは学校の電子メールとパスワードを入力し、登録している場合はログインします。登録していない場合は、ログインの2番目の部分でペンネームとパスワードを確認してください。このため、そして私の複雑なアマチュアDjangoプログラミングのために、erという名前のエラーのリストがあります。瞬間的に、プログラムが電子メールが学校のものであるかどうかをテストするとき、それはerリストに「学校の電子メールのみ」を追加するかもしれません。また、2つのフォームクラスも使用しています。このページでは、ajaxを使用してこの関数を呼び出します。この関数は、サイトのサイズが小さいため、JSONではなくプレーンHTMLを使用します。

forms.pyファイルに私は持っています:

class log_in(forms.Form):
    username = forms.EmailField(error_messages= {'required': "Email Field is required,", 'invalid' : "Invalid Email Address."})
    password = forms.CharField(help_text = 'Password Invalid')

class new_user(forms.Form):
    username = forms.EmailField(error_messages = {'required': "Email Field is required,", 'invalid' : "Invalid Email Address."})
    password = forms.CharField(required=True)
    password2 = forms.CharField(required=True)
    pen_name = forms.CharField(max_length=30, min_length=3, error_messages = {'required': "Pen Name is required", 'max_length': "Pen Name must be less than 30 characters", 'min_length': "Pen Name must be more than 3 characters"})

問題は、error_message引数で指定した完全なエラーメッセージをerリストに転送したいということです。

これは私のviews.pyファイルです

def user_log_in(request):
    er = []
    user_pass = log_in(request.POST)
    if user_pass.is_valid(): # If it is valid at all
        cleaned_info = user_pass.cleaned_data
        email_bbn = cleaned_info['username'].split("@")
        if 'bbns.org' in email_bbn: # Check if BBN email address
            user_object = User.objects.filter(email = cleaned_info['username'])
            if user_object.exists():
                logged_in_user = auth.authenticate(username=cleaned_info['username'], password=cleaned_info['password'])
                #add in is_active
                if logged_in_user is not None: #If password is right
                    if user_object[0].get_profile().activated:
                        auth.login(request, logged_in_user)
                        return HttpResponseRedirect("")
                    else:
                        return HttpResponse("not_act")
                else:
                    er.append("Incorrect Password")
            else: # If new user
                new_user_pass = new_user(request.POST)
                if new_user_pass.is_valid():
                    cleaned_info_new = new_user_pass.cleaned_data
                    if cleaned_info_new['password'] == cleaned_info_new['password2']:
                        msg = "In order to activate your account at Knights of the Round Table, please click on this link:"
                        try:
                            send_mail('Activate', msg, 'michaelrgoldfine@gmail.com', [cleaned_info_new['username']], fail_silently=False)
                            new_user_object = User.objects.create_user(
                                username=cleaned_info_new['username'],
                                password=cleaned_info_new['password'],
                                email=cleaned_info_new['username']
                            )
                            new_user_profile = new_user_object.get_profile()
                            new_user_profile.pen_name = cleaned_info_new['pen_name']
                            new_user_profile.activated = False;
                            new_user_profile.save()
                            return HttpResponse("not_act")
                        except:
                            er.append("Error Sending Email")
                    else:
                        er.append('Passwords are not the same')
                elif "TN" in request.POST: #If open but not filled in
                    print "TN"
                    er.append(new_user_pass.pen_name.error_messages)
                else: # if new user field
                    print "n_usr"
                    return HttpResponse('n_usr')
        else:
            er.append("BBN email addresses only")
    else:
        for e in user_pass.errors:
            er.append(e)
    errors_template = Template("{% for e in errors %}<li>{{ e }}</li> {% endfor %}")
    errors_html = errors_template.render(Context({'errors':er}))
    return HttpResponse(errors_html)

エラーを2回アクセスしようとします。一度、else最後にforループが表示elseされ、その2つ上に表示されelif 'TN'...ます。最後の1つは、無効なフィールドを返すだけです(したがって、user_nameまたはpen_nameを取得します)。もう1つは、フォームにオブジェクトpen_nameや私が使用するものがないことを示しています。

4

2 に答える 2

1

実際のフォームにエラーを追加した方がよいでしょう。フォームには、フォーム_errorsによって生成されたすべてのエラーを含む dict が添付されています。「フィールド以外のエラー」(特定のフィールドに直接関連しないエラー、または複数のフィールドに関連するエラー)はform._errors['__all__']. フィールド固有のエラーはすべて、フィールド名のキーに入ります。したがって、fooフィールドのエラーはform._errors['foo'].

現在、辞書内の各項目のエラーのリストは、_errors実際にはErrorListタイプであり、標準のリストではありません。したがって、フォームにエラーを追加するには、次のようにします。

from django.forms.util import ErrorList

form._errors.setdefault('foo', ErrorList()).append('Some error here')

または、フィールド以外のエラーにエラーを追加するには:

form._errors.setdefault('__all__', ErrorList()).append('Some error here')

次に、フォームがレンダリングされると、通常の検証エラーと同様に、すべてのエラーが本来あるべき場所に自然に分類されます。

于 2012-08-07T16:37:30.197 に答える