3

ModelForms のフィールド検証を制御する方法がわかりません。

ここに私のモデルフォームがあります:

class UserForm(ModelForm):
    class Meta:
        model = User
        fields = ('email', 'password')

テンプレートでフォームをレンダリングする方法は次のとおりです。

<form method="post" action="">
    {% csrf_token %}
    {{ userform.as_p }}
    <input type="submit" value="Submit" />
</form>

これが私の見解です:

def login_page(request):
    if request.method == 'POST':
        userform = UserForm(request.POST)
        if userform.is_valid():
            email = request.POST['email']
            password = request.POST['password']
            user = authenticate(username=email, password=password)
            if user is not None:
                login(request, user)
                return redirect('/dashboard/')
            else:
                # How can I give the user feedback about authentication failute here. Right now it just reloads the form without any messages.
                return render(request, "login.html", {"userform": userform}) 
        else:
            # Because .is_valid() is called, The userform will validate for email addresses and that a password input is present here.
            return render(request, "login.html", {"userform": userform}) 
    else:
        userform = UserForm()
        return render(request, "login.html", {"userform": userform})

ドキュメントを読むと、フォームにカスタム属性を渡すのと同じくらい簡単なはずです。しかし、ModelForm を使用しているため、これが同じ方法で実現されるかどうかはわかりません。

ModelForm フィールドのエラーを制御するための最良の方法について、例やヒントを提供してくれる人はいますか?

ありがとう!

4

3 に答える 3

1

エラーまたは警告メッセージをユーザーに返したい場合(検証されたフォームにエラーがない場合でも)、メッセージングフレームワークを使用するか、カスタムエラーメッセージをフォームに挿入できます。

メッセージングフレームワークが最善の策だと思います。フォームにエラーを挿入するのは良い考えではないと思います。誰かが間違ったユーザー名とpwordを入力した場合、それは検証エラーではないため、そのように扱われるべきではありません。検証エラーは、誤ったタイプのデータがフィールドに入力された場合にのみスローされ、誤った値はスローされません。

于 2012-08-01T23:07:00.713 に答える
1

Django認証アプリには、使用するものが組み込まれAuthenticationFormています。ソースコードを見ると、cleanメソッド内のユーザー名とパスワードを確認するというアプローチがわかります。そうすれば、ユーザー名とパスワードの組み合わせが無効な場合に検証エラーが発生する可能性があり、フォームにエラーが表示されます。

次のインポートを使用して、をインポートAuthenticationFormしてログインビューで使用できます。

from django.contrib.auth.forms import Authentication

login組み込みのビューも使用できる場合があります。これは、ユーザーがCookieを有効にしていない場合にメッセージを表示するなど、追加された機能を利用できることを意味します。また、セキュリティの脆弱性が発生する可能性も低くなります。

于 2012-08-02T00:18:26.267 に答える
1

非常に簡単です。エラー メッセージを表示するには複数の方法があります。

最初の1つ:

1-フォーム/モデルフォーム内のクリーンメソッドをオーバーライドします:

def clean(self):
    # To keep the main validation and error messages
    super(your_form_name, self).clean()

    # Now it's time to add your custom validation
    if len(self.cleaned_data['password']) < 10:
         self._errors['password']='your password\'s length is too short'
         # you may also use the below line to custom your error message, but it doesn't work with me for some reason
         raise forms.ValidationError('Your password is too short')

二つ目

バリデータに組み込まれているdjangoを使用する。

モデル内でバリデーターを使用して、次のようなカスタム エラー メッセージを表示できます。

RE = re.compile('^[0-9]{10}$')

field_name = models.CharField('Name', default='your_name',validators=[RegexValidator(regex=RE, message="Inapproperiate Name!")],)

バリデーターは、検証可能な複数の組み込み検証ルールを利用できます。

このdjangoのドキュメントを参照してください

また、フォーム定義内でバリデーターを使用することもできますが、バリデーター内のエラー メッセージは、エラーが発生した場合のモデルのようには機能しません。エラー メッセージをカスタマイズするには、以下の 3 番目の方法を使用します。

3 番目の方法:

skill = forms.CharField(
    label = 'SSkill', 
    min_length = 2,
    max_length = 12, 
    # message kwarg is only usable in models, yet,
    #it doesn't spawn error here.
    #validators=[RegexValidator(regex=NME, message="In-approperiate number!")], 
    required = True,
    #Errors dictionary 
    error_messages={'required': 'Please enter your skill','min_length':'very short entry','invalid':'Improper format'}, 
    #Similar to default you pass in model
    initial = 'Extreme Coder'
) 

ここで、requied、min_length、max_length などはすべて kw 引数の形式であり、数行上のバリデーターがバリデーター内で選択した基準と一致しなかった場合にのみ、無効なものが選択されます。

第四の方法

このメソッドでは、モデルフォームの定義を次のようにオーバーライドします。

def __init__(self, *args, **kwargs):
    super(Your_Form, self).__init__(*args, **kwargs)
    self.fields['password'].error_messages['required'] = 'I require that you fill out this field'

第五の方法:

次のようなスタック オーバーフローの投稿の 1 つで、エラーをカスタマイズする良い方法を見てきました。

class Meta:
    model = Customer 
    exclude = ('user',)
    fields = ['birthday','name'] 
    field_args = {
        "name" : {
            "error_messages" : {
                "required" : "Please let us know what to call you!"
                "max_length" : "Too short!!!"
            }           
        }
    }

5番目の方法への参照は次のとおりです。ブレンデルのブログ

他の/より良い方法があるかもしれませんが、少なくとも私にとっては、それらが最も一般的です:-)

この投稿がお役に立てば幸いです。

于 2012-10-30T08:38:25.813 に答える