Saya mencoba membangun situs web sederhana dengan fungsi masuk yang sangat mirip dengan yang ada di sini di SO. Pengguna harus dapat menjelajahi situs sebagai pengguna anonim dan akan ada tautan masuk pada setiap halaman. Saat mengklik tautan login, pengguna akan dibawa ke formulir login. Setelah login berhasil, pengguna harus dibawa kembali ke halaman dari mana ia mengklik tautan login. Saya menduga bahwa saya harus meneruskan url halaman saat ini ke tampilan yang menangani formulir login tetapi saya tidak dapat membuatnya berfungsi.
EDIT: Saya sudah menemukan jawabannya. Saya menautkan ke formulir masuk dengan melewati halaman saat ini sebagai parameter GET dan kemudian menggunakan 'berikutnya' untuk mengarahkan ulang ke halaman itu. Terima kasih!
EDIT 2: Penjelasan saya sepertinya tidak jelas sehingga seperti yang diminta di sini adalah kode saya: Mari kita katakan kita berada di halaman foo.html dan kita belum login. Sekarang kita ingin memiliki tautan pada foo.html tautan itu untuk login.html. Di sana kita bisa masuk dan kemudian diarahkan kembali ke foo.html. Tautan di foo.html terlihat seperti ini:
<a href='/login/?next={{ request.path }}'>Login</a>
Sekarang saya menulis tampilan masuk khusus yang terlihat seperti ini:
def login_view(request):
redirect_to = request.REQUEST.get('next', '')
if request.method=='POST':
#create login form...
if valid login credentials have been entered:
return HttpResponseRedirect(redirect_to)
#...
return render_to_response('login.html', locals())
Dan baris penting dalam login.html:
<form method="post" action="./?next={{ redirect_to }}">
Jadi ya itu cukup banyak, harapan yang membuatnya jelas.
Jawaban:
Anda tidak perlu membuat tampilan tambahan untuk ini, fungsionalitasnya sudah terpasang.
Pertama setiap halaman dengan tautan login perlu mengetahui jalur saat ini, dan cara termudah adalah menambahkan preprosessor konteks permintaan ke settings.py (4 pertama adalah default), maka objek permintaan akan tersedia di setiap permintaan:
settings.py:
Kemudian tambahkan template yang Anda inginkan tautan Login:
base.html:
Ini akan menambahkan argumen GET ke halaman login yang menunjuk kembali ke halaman saat ini.
Template login kemudian dapat sesederhana ini:
registrasi / login.html:
sumber
request.path
null, jadi saya membuatnya{% firstof request.path '/' %}
, dengan cara itu jika jalur permintaan tidak tersedia untuk beberapa alasan pengguna dikirim ke halaman beranda.<a href="{% url auth_login %}?next={% firstof request.path '/' %}">Login</a>
sebagai gantinya.next
akan menjadi seperti/accounts/logout/
dan setelah pengguna login, ia akan segera keluar kembali lol, dan loop berlanjut.Ini mungkin bukan "praktik terbaik", tetapi saya telah berhasil menggunakan ini sebelumnya:
sumber
Untuk mendukung url lengkap dengan param / nilai yang Anda butuhkan:
bukan hanya:
sumber
Otentikasi internal Django berfungsi seperti yang Anda inginkan.
Halaman login mereka termasuk
next
string kueri yang merupakan halaman untuk kembali setelah login.Lihatlah http://docs.djangoproject.com/en/dev/topics/auth/#django.contrib.auth.decorators.login_required
sumber
Saya menautkan ke formulir masuk dengan melewati halaman saat ini sebagai parameter GET dan kemudian menggunakan 'berikutnya' untuk mengarahkan ulang ke halaman itu. Terima kasih!
sumber
Saya mengalami masalah yang sama. Solusi ini memungkinkan saya untuk tetap menggunakan tampilan login umum:
sumber
Dalam
registration/login.html
(bersarang di dalamtemplates
folder) jika Anda memasukkan baris berikut, halaman tersebut akan dirender seperti halaman login admin asli Django:Catatan: File hanya boleh berisi baris di atas.
sumber
Lihat django docs untuk views.login () , Anda memberikan nilai 'berikutnya' (sebagai bidang tersembunyi) pada formulir input untuk dialihkan ke setelah login berhasil.
sumber
Anda juga bisa melakukan ini
sumber