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.