2011-01-10 22 views
12

Vì vậy, ngay bây giờ tôi đang thực hiện đăng nhập cơ bản. Trong urls.py, tôi đi đến django contrib đăng nhập:Làm cách nào để mở rộng biểu mẫu "đăng nhập" Django?

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

Đó bắn nó ở đây:

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

Quan điểm này sử dụng mô hình hình thức AuthenticationForm:

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) 

Vì vậy .. Mục tiêu của tôi là thay đổi mẫu tên người dùng! Bằng cách thêm nó vào: widget = forms.TextInput(attrs={'placeholder': 'username'}). Đó là nó. Đó là tất cả những gì tôi muốn thêm vào hộp nhập tên người dùng. Nhưng, tôi không muốn thay đổi tập tin django forms.py thực tế, vì đó là một phần của django contrib và tôi cảm thấy xấu khi thay đổi tập tin đó.

Tôi phải làm gì? Tôi có nên tạo một biểu mẫu mở rộng AuthenticationForm không? Nếu vậy, làm cách nào để nhập? Và làm thế nào để vượt qua điều đó như một đối số thông qua urls.py của tôi? Tôi không biết phải làm gì.

Trả lời

21

Bạn cần phải phân lớp lớp AuthenticationForm, và sau đó bạn cần phải thay đổi urls.py của bạn,

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

Sau đó nhập lớp này vào tập tin urls.py của bạn và cập nhật các cuộc gọi,

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

tôi m quá mệt mỏi để tra cứu các liên kết trên trang web tài liệu để xem loại trường bạn cần sử dụng nhưng điều này sẽ làm các mẹo để giúp bạn bắt đầu mà không cần phải sửa đổi django forms.py mà bạn de finitely nên cảm thấy xấu về việc thay đổi!

1

milkypostman cho biết, bạn cần tạo lớp con của auth.forms.AuthenticationForm.

Sau đó, bạn có thể sử dụng các hình thức django-giòn để đặt trình giữ chỗ vào các trường bạn muốn. Nó cũng đơn giản như thế này:

(app/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'))) 

Cuối cùng, đừng quên sử dụng thẻ giòn trong mẫu của bạn:

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

Cảm ơn con trỏ đến giòn! – rikb

Các vấn đề liên quan