Làm cách nào để sử dụng chế độ xem đặt lại / thay đổi mật khẩu được tích hợp sẵn với các mẫu của riêng tôi


92

Ví dụ: tôi có thể trỏ url '^/accounts/password/reset/$'tới django.contrib.auth.views.password_resetbằng tên tệp mẫu của mình trong ngữ cảnh nhưng tôi nghĩ cần gửi thêm chi tiết ngữ cảnh.

Tôi cần biết chính xác ngữ cảnh cần thêm cho mỗi lần đặt lại mật khẩu và thay đổi chế độ xem.


1
Với tiêu đề của câu hỏi này, tôi không nghĩ đó contextlà điều phù hợp mà bạn đang tìm kiếm!
jb.

2
Chỉ để xác nhận, theo "ngữ cảnh", tôi muốn nói đến từ điển của dữ liệu bổ sung là đối số thứ 3 của một dòng url. hay còn gọi là dữ liệu bổ sung hoặc kwargs . Xin lỗi vì sự nhầm lẫn, xin vui lòng chỉnh sửa câu hỏi, bất cứ ai có thể.
Tom Viner

Câu trả lời:


100

Nếu bạn xem các nguồn cho django.contrib.auth.views.password_reset, bạn sẽ thấy rằng nó sử dụng RequestContext. Kết quả là, bạn có thể sử dụng Bộ xử lý ngữ cảnh để sửa đổi ngữ cảnh có thể cho phép bạn đưa thông tin mà bạn cần.

Danh sách b có một giới thiệu tốt về bộ xử lý ngữ cảnh .

Chỉnh sửa (dường như tôi đã nhầm lẫn về câu hỏi thực sự là gì):

Bạn sẽ nhận thấy rằng password_resetcó một tham số được đặt tên là template_name:

def password_reset(request, is_admin_site=False, 
            template_name='registration/password_reset_form.html',
            email_template_name='registration/password_reset_email.html',
            password_reset_form=PasswordResetForm, 
            token_generator=default_token_generator,
            post_reset_redirect=None):

Kiểm tra password_reset để biết thêm thông tin.

... do đó, với urls.py như:

from django.conf.urls.defaults import *
from django.contrib.auth.views import password_reset

urlpatterns = patterns('',
     (r'^/accounts/password/reset/$', password_reset, {'template_name': 'my_templates/password_reset.html'}),
     ...
)

django.contrib.auth.views.password_resetsẽ được gọi cho các URL phù hợp '/accounts/password/reset'với đối số từ khóa template_name = 'my_templates/password_reset.html'.

Nếu không, bạn không cần phải cung cấp bất kỳ ngữ cảnh nào vì password_resetchế độ xem tự xử lý. Nếu bạn muốn xem bạn có sẵn ngữ cảnh nào, bạn có thể kích hoạt TemplateSyntaxlỗi và xem qua dấu vết ngăn xếp, tìm khung có tên biến cục bộ context. Nếu bạn muốn sửa đổi ngữ cảnh thì những gì tôi đã nói ở trên về bộ xử lý ngữ cảnh có lẽ là cách tốt nhất.

Tóm lại: bạn cần làm gì để sử dụng mẫu của riêng mình? Cung cấp template_nameđối số từ khóa cho dạng xem khi nó được gọi. Bạn có thể cung cấp các đối số từ khóa cho các chế độ xem bằng cách đưa từ điển làm thành viên thứ ba của bộ mã mẫu URL.


Tôi tin rằng câu hỏi là về việc sử dụng các mẫu khác nhau với các chế độ xem dựng sẵn - Bộ xử lý ngữ cảnh không ảnh hưởng đến nó!
jb.

6
bất kỳ ý tưởng, làm thế nào để cho registration/password_reset_email.htmlthực sự chứa các thành phần html như: <div>, <a>vì đây sẽ gửi văn bản chỉ
mabdrabo

@mabdrabo - hãy xem bài viết này về cách làm cho HTML hoạt động.
gregoltsov

26

Thực sự giới thiệu bài viết này.

Tôi vừa cắm nó vào và nó hoạt động

http://garmoncheg.blogspot.com.au/2012/07/django-resetting-passwords-with.html


2
liên kết tuyệt vời, cảm ơn. cho những người theo liên kết - đăng ký django hiện bao gồm các chế độ xem xác thực mặc định ... vì vậy tất cả những gì bạn phải làm là tạo các mẫu được nêu chi tiết trong liên kết ở trên. Ngoài ra - hãy sử dụng django-giòn-form nếu bạn muốn tránh tất cả các công việc tạo form html thủ công mà anh ấy đã làm.
dougvk

Có một số mã Django kế thừa mà tôi phải quản lý tại nơi làm việc, nhưng tôi hầu như không biết gì về framework. Gã đó đã cứu tôi! Hướng dẫn tuyệt vời
Matt Vukas

Cảm ơn các liên kết! Tôi nghĩ đây phải là câu trả lời được chấp nhận vì như bạn đã nói, cắm nó vào và nó hoạt động.
ihatecache

10

Bạn chỉ cần gói các chức năng hiện có và chuyển vào mẫu bạn muốn. Ví dụ:

from django.contrib.auth.views import password_reset

def my_password_reset(request, template_name='path/to/my/template'):
    return password_reset(request, template_name)

Để xem điều này, hãy xem phần khai báo hàm của các khung nhìn được tạo sẵn:

http://code.djangoproject.com/browser/django/trunk/django/contrib/auth/views.py#L74


2
Không phải là cách đơn giản nhất để làm điều đó. Bạn có thể chuyển vào từ điển dưới dạng phần thứ ba của bộ tuple mẫu URL hoặc, nếu bạn cảm thấy thực sự phải kết hợp hàm, bạn có thể sử dụng: password_reset = functools.partial (password, template_name = "path / to / my / template" )
Aaron Maenpaa

7

Bạn có thể làm như sau:

  1. thêm vào urlpatterns của bạn (r '^ / account / password / reset / $', password_reset)
  2. đặt mẫu của bạn vào '/templates/registration/password_reset_form.html'
  3. đặt ứng dụng của bạn trước 'django.contrib.auth' trong INSTALLED_APPS

Giải trình:

Khi các mẫu được tải, chúng được tìm kiếm trong biến INSTALLED_APPS của bạn trong settings.py. Thứ tự được quy định bởi xếp hạng của định nghĩa trong INSTALLED_APPS, do đó, vì ứng dụng của bạn có trước khi 'django.contrib.auth' nên mẫu của bạn được tải (tham khảo: https://docs.djangoproject.com/en/dev/ref/templates/api /#django.template.loaders.app_directories.Loader ).

Động lực của cách tiếp cận:

  1. Tôi muốn khô hơn và không lặp lại cho bất kỳ chế độ xem nào (được xác định bởi django) tên mẫu (chúng đã được xác định trong django)
  2. Tôi muốn một url.py nhỏ nhất

2

Một giải pháp khác, có lẽ đơn giản hơn là thêm thư mục mẫu ghi đè của bạn vào mục nhập DIRS của cài đặt TEMPLATES trong settings.py. (Tôi nghĩ cài đặt này là mới trong Django 1.8. Nó có thể đã được gọi là TEMPLATE_DIRS trong các phiên bản Django trước.)

Như vậy:

TEMPLATES = [
   {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        # allow overriding templates from other installed apps                                                                                                
        'DIRS': ['my_app/templates'],
        'APP_DIRS': True,
}]

Sau đó đặt các tệp mẫu ghi đè của bạn bên dưới my_app/templates. Vì vậy, mẫu đặt lại mật khẩu bị ghi đè sẽ làmy_app/templates/registration/password_reset_form.html


1

Các tài liệu nói rằng chỉ có một biến bối cảnh, form.

Nếu bạn gặp sự cố với đăng nhập (điều này thường gặp), tài liệu cho biết có ba biến ngữ cảnh:

  • form: Một đối tượng Biểu mẫu đại diện cho biểu mẫu đăng nhập. Xem tài liệu biểu mẫu để biết thêm về các đối tượng Biểu mẫu.
  • next: URL chuyển hướng đến sau khi đăng nhập thành công. Điều này cũng có thể chứa một chuỗi truy vấn.
  • site_name: Tên của Trang web hiện tại, theo cài đặt SITE_ID.

2
Tài liệu cho biết có một "đối số tùy chọn" được gọi là "template_name" có vẻ phù hợp hơn.
jb.

Đối số tùy chọn là đối số cho hàm, không phải ngữ cảnh được cung cấp cho biểu mẫu.
S.Lott

Mmm- Tôi nghĩ câu hỏi khó hiểu ở chỗ nó nói về 'bối cảnh' trong khi thực sự tất cả những gì liên quan đến việc giải quyết vấn đề này là lập luận của password_resetquan điểm.
jb.

1

Tôi đang sử dụng hai dòng này trong url và mẫu từ quản trị viên, những gì tôi đang thay đổi theo nhu cầu của mình

url(r'^change-password/$', 'django.contrib.auth.views.password_change', {
    'template_name': 'password_change_form.html'}, name="password-change"),
url(r'^change-password-done/$', 'django.contrib.auth.views.password_change_done', {
    'template_name': 'password_change_done.html'
    }, name="password-change-done")
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.