Yerleşik parola sıfırlama / değiştirme görünümlerini kendi şablonlarımla nasıl kullanırım?


93

Mesela ben işaret edebilir url '^/accounts/password/reset/$'etmek django.contrib.auth.views.password_resetbağlamında benim şablon dosya adıyla ama daha fazla bağlam bilgi göndermek ihtiyacını düşünüyorum.

Her bir şifre sıfırlama ve değişiklik görünümleri için tam olarak hangi bağlamı ekleyeceğimi bilmem gerekiyor.


1
Bu sorunun başlığı göz önüne alındığında, contextaradığınız doğru şeyin olduğunu sanmıyorum !
— jb.

2
Sadece "bağlam" derken, bir url satırının 3. argümanı olan ekstra veri sözlüğünü kastettim. aka ekstra veri veya kwargs . Karışıklık için özür dileriz, lütfen soruyu düzenleyebilen herkes.
— Tom Viner

Yanıtlar:


100

Django.contrib.auth.views.password_reset kaynaklarına bakarsanız, kullandığını göreceksiniz RequestContext. Sonuç olarak, ihtiyaç duyduğunuz bilgileri enjekte etmenize olanak tanıyabilecek bağlamı değiştirmek için Bağlam İşlemcileri kullanabilirsiniz.

B listesi, bağlam işlemcilerine iyi bir giriş içerir .

Düzenleme (Asıl sorunun ne olduğu konusunda kafam karışmış görünüyor):

password_resetAdlandırılmış bir parametre aldığını fark edeceksiniz 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):

Daha fazla bilgi için password_reset'i kontrol edin .

... böylelikle urls.py gibi:

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_reset'/accounts/password/reset'anahtar kelime bağımsız değişkeniyle eşleşen URL'ler için çağrılacaktır template_name = 'my_templates/password_reset.html'.

Aksi takdirde, password_resetgörünüm kendi kendine bakacağından herhangi bir bağlam sağlamanıza gerek yoktur . Hangi içeriğe sahip olduğunuzu görmek istiyorsanız, bir TemplateSyntaxhatayı tetikleyebilir ve yığın izlemesine bakabilirsiniz adında yerel bir değişkenle çerçeveyi buluncontext . Bağlamı değiştirmek istiyorsanız, bağlam işlemcileri hakkında yukarıda söylediklerim muhtemelen doğru yoldur.

Özetle: Kendi şablonunuzu kullanmak için ne yapmanız gerekiyor? template_nameGörünüme çağrıldığında bir anahtar kelime argümanı sağlayın . URL model demetinin üçüncü üyesi olarak bir sözlük ekleyerek görünümlere anahtar kelime argümanları sağlayabilirsiniz.


Sorunun yerleşik görünümlere sahip farklı şablonlar kullanmakla ilgili olduğuna inanıyorum - Bağlam işlemcileri bunu etkilemez!
— jb.

6
bir fikrin nasıl izin registration/password_reset_email.html: gibi html unsurları içeren aslında <div>, <a>bu metin yalnızca gönderdiği için
— mabdrabo

@mabdrabo - HTML'yi nasıl çalıştıracağınıza dair bu makaleye göz atın .
— gregoltsov

26

Bu makaleyi kesinlikle tavsiye ederim.

Sadece fişe taktım ve işe yaradı

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


2
harika bağlantı, teşekkürler. bağlantıyı izleyenler için - django-kaydı artık varsayılan kimlik doğrulama görünümlerini içeriyor ... bu nedenle tek yapmanız gereken yukarıdaki bağlantıda ayrıntılı olarak açıklanan şablonları oluşturmaktır. Ayrıca - yaptığı tüm manuel html form işlerinden kaçınmak istiyorsanız django-crispy-formları kullanın.
— dougvk

İş yerinde yönetmem gereken eski bir Django kodu var, ancak çerçeve hakkında neredeyse hiçbir şey bilmiyorum. O adam kıçımı kurtardı! Harika öğretici
— Matt Vukas

Bağlantı için teşekkürler! Dediğiniz gibi fişe taktığınızdan ve işe yaradığından beri kabul edilen cevap bu olmalı diye düşünüyorum.
— ihatecache

10

Sadece mevcut işlevleri sarmalamanız ve istediğiniz şablonu geçirmeniz yeterlidir. Örneğin:

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)

Bunu görmek için yerleşik görünümlerin işlev bildirimine bir göz atın:

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


2
Bunu yapmanın en basit yolu değil. Bir sözlüğü, bir URL kalıpları kümesinin üçüncü parçası olarak iletebilir veya işlevi gerçekten sarmalamanız gerektiğini düşünüyorsanız, şunu kullanabilirsiniz: password_reset = functools.partial (şifre, şablon_adı = "yol / / şablonum / şablonum" )
— Aaron Maenpaa

7

Aşağıdakileri yapabilirsiniz:

  1. url şablonlarınıza ekleyin (r '^ / hesaplar / şifre / sıfırlama / $', şifre_reset)
  2. şablonunuzu "/templates/registration/password_reset_form.html" içine yerleştirin
  3. INSTALLED_APPS içinde uygulamanızı "django.contrib.auth" dan önce getirin

Açıklama:

Şablonlar yüklendiğinde, settings.py'deki INSTALLED_APPS değişkeninizde aranırlar. Sipariş, INSTALLED_APPS'deki tanımın sıralamasına göre belirlenir, bu nedenle uygulamanız şablonunuz yüklendiği 'django.contrib.auth'dan önce geldiğinden (referans: https://docs.djangoproject.com/en/dev/ref/templates/api /#django.template.loaders.app_directories.Loader ).

Yaklaşım motivasyonu:

  1. Daha kuru olmak istiyorum ve herhangi bir görünüm için (django tarafından tanımlanan) şablon adını tekrar etmiyorum (bunlar zaten django'da tanımlanmıştır)
  2. En küçük url.py istiyorum

2

Başka, belki daha basit bir çözüm, geçersiz kılma şablon dizininizi settings.py içindeki ŞABLONLAR ayarının DIRS girişine eklemektir. (Bu ayarın Django 1.8'de yeni olduğunu düşünüyorum. Önceki Django sürümlerinde TEMPLATE_DIRS olarak adlandırılmış olabilir.)

Şöyle:

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

Ardından, geçersiz kılma şablon dosyalarınızı altına yerleştirin my_app/templates. Böylece geçersiz kılınan şifre sıfırlama şablonumy_app/templates/registration/password_reset_form.html


1

Dokümantasyon diyor orada sadece bir bağlam değişkeni olduğunu, form.

Giriş yapma konusunda sorun yaşıyorsanız (ki bu yaygındır), dokümantasyon üç bağlam değişkeni olduğunu söyler:

  • form: Oturum açma formunu temsil eden bir Form nesnesi. Form nesneleri hakkında daha fazla bilgi için form belgelerine bakın.
  • next: Başarılı bir şekilde oturum açtıktan sonra yeniden yönlendirilecek URL. Bu da bir sorgu dizesi içerebilir.
  • site_name: SITE_ID ayarına göre mevcut Sitenin adı.

2
Belgeler, daha alakalı görünen "şablon_adı" adında "isteğe bağlı bir bağımsız değişken" olduğunu söylüyor.
— jb.

İsteğe bağlı bağımsız değişken, forma sağlanan bağlam değil, işlev için bir bağımsız değişkendir.
— S.Lott

Mmm- Bence soru 'bağlam'dan bahsediyor, çünkü bunu çözmekle gerçekten ilgili olan tek şey görüşün argümanlarıyken password_reset.
— jb.

1

Bu iki satırı url'de kullanıyordum ve yöneticiden gelen şablonu ihtiyacıma göre değiştiriyordum

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")
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.