Ссылка на проверку электронной почты в Django перенаправляет на последнюю страницу вместо заданного url
У меня есть сайт на django, где пользователь может выбрать "зарегистрироваться" на многих разных страницах с разными адресами. Я хочу, чтобы ссылка авторизации, которую они получают, возвращала их на страницу, на которой они были, а не на какую-то заданную страницу. У меня все устроено следующим образом: *** использование стандартного класса Abstract User
urls.py
urlpatterns = [
path('signup/', SignUpView.as_view(), name='signup'),
path('activate/<uid>/<token>/', ActivateAccount.as_view(), name='activate'),
]
***использование стандартного входа/регистрации django с пользовательскими шаблонами
registration/signup.html
{% extends 'gitrepo/base.html' %}
{% block title %}Sign Up{% endblock %}
{% block content %}
<h2>Sign Up</h2>
<p>Register using your username. <br>
You will be asked to verify your email.</p>
<form method="post">
{% csrf_token %}
{{ form.as_p }}
{% if request.GET.next %}
<input type="hidden" name="next" value="{{ request.GET.next}}">
{% endif %}
<button type="submit">Sign Up</button>
</form>
<p><b>
{% if messages %}
{% for message in messages %}
<div class="alert {% if message.tags %}alert-{{ message.tags }}{% endif %}" role="alert">{{ message }}</div>
{% endfor %}
{% endif %}
</b></p>
{% endblock %}
*** это запрашивает ldap для получения электронной почты пользователя в следующем
views.py
User = get_user_model()
class SignUpView(View):
form_class = UserCreationForm
template_name = 'registration/signup.html'
def get(self, request, *args, **kwargs):
form = self.form_class()
return render(request, self.template_name, {'form': form})
def post(self, request, *args, **kwargs):
form = self.form_class(request.POST)
uid = request.POST.get('username')
if ldap_query_uid(uid):
if form.is_valid():
user = form.save(commit=False)
user.is_active = False
user.email = ldap_get_email(request.POST.get('username'))
user.save()
current_site = get_current_site(request)
subject = 'Activate Your Kerneloscope Account'
message = render_to_string('registration/account_activation_email.html', {
'user': user,
'domain': current_site.domain,
'uid': user.username,
'token': default_token_generator.make_token(user),
'next': request.POST.get('next')
})
user.email_user(subject, message)
messages.success(request, ('An email has been sent to ' + user.email +
'Please confirm your email to complete registration.'))
return redirect('login')
else:
messages.error(request, ('No user/email was found for username ' + uid + ' at redhat.com'))
return render(request, self.template_name, {'form': form})
class ActivateAccount(View):
def get(self, request, uid, token, *args, **kwargs):
try:
user = User.objects.get(username=uid)
except (TypeError, ValueError, OverflowError, User.DoesNotExist):
user = None
print("please", request.GET.get('next'))
if user is not None and default_token_generator.check_token(user, token):
user.is_active = True
user.profile.email_confirmed = True
user.save()
login(request, user)
messages.success(request, ('Your account has been confirmed.'))
return redirect('index')
else:
messages.warning(request, ('The confirmation link was invalid, possibly because it has already been used.'))
return redirect('login')
acount_activation_email.html
{% autoescape off %}
Hi {{ user.username }},
Please click on the link below to confirm your registration:
{{ next }}
http://{{ domain }}{% url 'activate' uid=uid token=token %}
{% endautoescape %}
пример кода со страницы, вызывающей регистрацию
{% else %}
<p><b>
<a href="{% url 'login' %}?next={{request.path}}">Login</a> or
<a href="{% url 'signup' %}?next={{request.path}}">Sign Up</a> to comment
</b></p>
{% endif %}
В настоящее время у меня есть значение {{ next }}, которое успешно печатается в электронном письме (например, /pathname/specific_id_within_path ), на которое я хочу перенаправить. Однако я понятия не имею, как передать это значение в запрос, который формируется, когда пользователь нажимает на ссылку в письме активации.
Спасибо