Sizi ziyaret etmeye çalıştığınız sayfaya göndermeniz için 'django-Registration'ı almak

django.contrib.auth has an awesome feature: When you try to access a page that's decorated by login_required, you get redirected to the login page with a next argument, so after you login you get redirected back to the page you were originally trying to access. That's good for the user flow.

But, apparently django-registration does not provide a similar feature. I expected that if you register instead of login, you would also get a next thing, and after registering-n'-activating you'll get redirected to the page you were originally trying to visit. This is not the case, you're just redirected to some success page. This hurts the flow.

django-registration bu seçeneği sunar mı, ama ben kullanmıyorum veya doğru kullanmıyorum? Yoksa bunu yapmanın kolay bir yolu var mı?

9
Kaydolduktan sonra, e-postayla etkinleştirirsiniz ve ardından etkinleştirmeyi tamamladığınızda başlangıçta ziyaret etmeye çalıştığınız sayfaya yönlendirilmenizi beklerim.
katma yazar Ram Rachum, kaynak
Kaydı ne zaman yaptığınız veya e-posta yoluyla ne zaman etkinleştirdiğiniz hakkında mı konuşuyorsunuz?
katma yazar Timmy O'Mahony, kaynak

2 cevap

Bir hesabın e-postayla etkinleştirilmesinden sorumlu görünüme bakarsanız ( registration.views.activate ), "Başarılı aktivasyonda yönlendirilecek bir URL modelinin adı" olan success_url parametresini kabul ettiğini göreceksiniz.

Bu nedenle, bu görüntüyü çağıran ve yönlendirmek istediğiniz sayfayı sağlayan URL'nin üzerine yazmanız yeterlidir.

Yani kendi urls.py’nizde :

from registration.views import activate
urlpatterns = patterns('',
    url(r'^activate/(?P\w+)/$',
            activate,
            {'backend': 'registration.backends.default.DefaultBackend'},
            name='registration_activate',
            # You could use reverse() here instead of a URL to be DRY'er
            success_url = "http://..." 
            ),

Alternatif olarak, django-kayıtları kaydı kendi görünümünüzde aktif hale getirebilir ve yönlendirmek üzere bir GET parametresi kabul edebilirsiniz:

from registration.view import activate
def custom_activate(request, backend,
         template_name='registration/activate.html',
         success_url=None, extra_context=None, **kwargs):
    success_url = request.GET.get('next', None)
    return activate(request, template_name=template_name, success_url=success_url, extra_context=None, **kwargs)

Şimdi, şablonunuzda registration/activation_email.html , yeniden yönlendirme konumunu bağlantıya ekleyebilirsiniz:

{% url 'registration.view.activate' activation_key as a_url %}

Thanks! ....

{% autoescape off %}

    http://{{ site.domain }}{{ url_registration_activate }}/

{% endautoescape %}

Thanks!

DÜZENLEME

Tamam, yukarıdaki kodlanmış yönlendirmelerle ilgilidir. Sanırım bu istediğiniz akış.

  1. Kullanıcı bir sayfaya gitmeye çalışır
  2. Kullanıcı bir giriş/kayıt sayfasına yönlendirilir
  3. Kullanıcı o sayfada kaydolur ve bir e-posta gönderilir
  4. Kullanıcı e-postayı etkinleştirir ve görüntülemeye çalıştığı orijinal sayfaya yönlendirilir

Birinci adımda görüntülemeye çalıştıkları sayfanın dördüncü adıma kadar geçirilmeleri gerektiği ve bildiğimiz gibi, HTTP durumsuz olduğu için bu daha zordur.

Akla gelen ilk öneri yönlendirme, kayıt olurken bir oturum değişkenine kaydetmek ve ardından etkinleştirdiğinizde almaktır. Bunu yapmak için django-kayıtlarının üzerine yazabiliriz varsayılan arka uç bu sadece kayıt işleminin işlevselliğini belirleyen ve görünümlerden çağrılan yöntemlerle bir sınıf olan), özellikle register ve post_activation_redirect yöntemleridir:

custom_backend.py

from registration.backends.default import DefaultBackend
class RedirectBackend(DefaultBackend):
    def register(self, request, **kwargs):
        request.session['redirect'] = request.GET.get("next",None)
        super(RedirectBackend, self).register(request, **kwargs)

    def post_activation_redirect(self, request, user):
        return(request.session['redirect'], (), {})

ve django-kayıdının gerçekte bu arka ucu kullandığından emin olmak için, urls.py aracılığıyla görüşlerini sağlarız:

url(r'^activate/(?P\w+)/$',
    activate,
    {'backend': 'custombackend.RedirectBackend'},
    name='registration_activate'),
url(r'^register/$',
    register,
    {'backend': 'custombackend.RedirectBackend'},
    name='registration_register'),
12
katma
Bu ikinci yarı. İlk yarıya, kayıt yapan kişiye doğru next URL'sini bağlayarak ne olacak?
katma yazar Ram Rachum, kaynak
Önemli olan, kullanıcının başlangıçta sabit bir URL'ye değil, ziyaret etmeye çalıştığı görünüme yönlendirmektir. Öyleyse, kullanıcının ilk olarak ziyaret etmeye çalıştığı URL'yi daha sonra nasıl kaydedecek ve alacaksınız?
katma yazar Ram Rachum, kaynak
Ne demek istediğini anlamadım
katma yazar Timmy O'Mahony, kaynak
Cevabımı, dinamik bir URL ile etkinleştirmeden sonra yeniden yönlendirme yaklaşımıyla (yani, kullanıcının orijinal olarak görmeye çalıştığı url) güncelledik
katma yazar Timmy O'Mahony, kaynak

Aynı dekoratör kullanmalısınız @login_required, django-register de bunu kullanıyor.

4
katma
Bu da kullanıcının ziyaret etmeye çalıştığı orijinal sayfaya kaydolduktan sonra yönlendirilmesine neden olur mu?
katma yazar Ram Rachum, kaynak