2011-01-10 3 views
12

今、基本的なログインをしています。ここにそれを撃つDjangoの「ログイン」フォームを拡張するにはどうすればよいですか?

(r'^login/?$','django.contrib.auth.views.login',{'template_name':'login.html'}), 

@csrf_protect 
@never_cache 
def login(request, template_name='registration/login.html', 
      redirect_field_name=REDIRECT_FIELD_NAME, 
      authentication_form=AuthenticationForm): 

は、そのビューがAuthenticationFormフォームモデルを使用しています:urls.pyでは、私が寄贈ログインジャンゴに行く

class AuthenticationForm(forms.Form): 
    """ 
    Base class for authenticating users. Extend this to get a form that accepts 
    username/password logins. 
    """ 
    username = forms.CharField(label=_("Username"), max_length=30) 
    password = forms.CharField(label=_("Password"), widget=forms.PasswordInput) 

そうに.. 私の目的は、ユーザー名の書式を変更することです!これにこれを加えることによって:widget = forms.TextInput(attrs={'placeholder': 'username'})。それでおしまい。それが私がユーザー名入力ボックスに追加したいものです。しかし、私は実際のdjango forms.pyファイルを変更したくないです。これはdjango contribの一部であり、そのファイルを変更するのが悪いと感じています。

私は何をしますか? AuthenticationFormを拡張するフォームを作成する必要がありますか?もしそうなら、私はどのようにそれをインポートするのですか?そして、私はそれをurls.pyを介して引数としてどのように渡しますか?私は何をすべきかわからない。

答えて

21

あなたはAuthenticationFormクラスをサブクラス化する必要があり、その後、あなたはその後、私は「あなたのurls.pyファイルにこのクラスをインポートして、コールを更新し、

(r'^login/?$','django.contrib.auth.views.login',{'template_name':'login.html', 'authentication_form':MyAuthenticationForm}), 

あなたurls.py

class MyAuthenticationForm(AuthenticationForm): 
    # add your form widget here 
    widget = ..... 

を変更する必要がありますあまりにもあなたが使用する必要があるフィールドのタイプの種類を確認するためにドキュメンテーションサイトのリンクをルックアップに疲れているが、これはあなたがあなたがしているdjango forms.pyを変更することなく、有限会社が変わるのが悪いですね!

1

milkypostmanと言ったように、auth.forms.AuthenticationFormのサブクラスを作成する必要があります。

次に、django-crispy-formsを使用して、プレースホルダを必要なフィールドに配置できます。これは、このような単純なのです:

(アプリ/ forms.py)

class LoginWithPlaceholder(AuthenticationForm): 

    def __init__(self, *args, **kwargs): 
     super(LoginWithPlaceholder, self).__init__(*args, **kwargs) 
     self.helper = FormHelper() 
     self.helper.form_show_labels = False 
     self.helper.layout = Layout(Div(Field('username', placeholder='username'), css_class="form-group"), 
            Div(Field('password', placeholder='password'), css_class="form-group"), 
            Div(Submit('submit', 'Log in'))) 

最後に、あなたのテンプレートでサクサクタグを使用することを忘れないでください:用

<div class="col-sm-6 col-sm-offset-3">   
{% crispy form %}    
</div> 
+0

感謝さっぱりしたポインタ! – rikb