【发布时间】:2023-03-07 18:42:02
【问题描述】:
İmplemented pinax django-user-accounts 到我的项目并按照说明进行快速使用。包实施后,迁移工作完美,但是当我将 href 链接安排到注册和登录页面时,它会将我重定向到主页。
我想我错过了一些非常基本的东西,我需要帮助.. 下面你可以看到我的 url-mappings 和 href 链接..
main.urls
from django.contrib import admin
from django.urls import path
from django.conf.urls import url,include
from zetamedweb import views
from django.conf.urls.static import static
app_name = 'Index'
urlpatterns = [
url(r"^$", views.IndexView.as_view(),name='ındex'),
url('admin/', admin.site.urls),
url(r"^ Treatments/", include('Treatments.urls')),
url(r"^ AboutUs /", include('About_Us.urls')),
url(r"^ Contact /", include('Contact.urls')),
url(r"^ Travel_Tips /", include('Travel_Tips.urls')),
url(r"^ Destinations/", include('Destinations.urls')),
url(r"^ FAQ/", include('FAQ.urls')),
url(r"^ TailorMade/", include('TailorMade.urls')),
url(r"^ APP/",include('APP.urls')),
url(r"^account/", include("account.urls")),
]
app.urls(我只包含了用于 url 目的的 app_name)
from django.urls import path
from django.conf.urls import url
from account.views import (
ChangePasswordView,
ConfirmEmailView,
DeleteView,
LoginView,
LogoutView,
PasswordResetTokenView,
PasswordResetView,
SettingsView,
SignupView,
)
app_name = 'Lol'
urlpatterns = [
url("signup/$", SignupView.as_view(), name="account_signup"),
url("login/$", LoginView.as_view(), name="account_login"),
url("logout/$", LogoutView.as_view(), name="account_logout"),
url("confirm_email/<str:key>/$", ConfirmEmailView.as_view(), name="account_confirm_email"),
url("password/$", ChangePasswordView.as_view(), name="account_password"),
url("password/reset/$", PasswordResetView.as_view(), name="account_password_reset"),
url("password/reset/<str:uidb36>/<str:token>/$", PasswordResetTokenView.as_view(), name="account_password_reset_token"),
url("settings/$", SettingsView.as_view(), name="account_settings"),
url("delete/$", DeleteView.as_view(), name="account_delete"),
]
和html页面上的href链接应该重定向我的登录和注册页面而不是主页..
<li class="nav-item"><a class="nav-link" href="{% url 'Lol:account_login' %}"><button class="btn btn-success btn-circle" type="button">SIGN IN</button></a>
</li>
<li class="nav-item"><a class="nav-link" href="{% url 'Lol:account_signup' %}"><button class="btn btn-success btn-circle" type="button">SIGN UP</button></a>
</li>
任何帮助和建议都将不胜感激。我现在真的陷入困境,几个小时以来一直在尝试解决这个问题。
views.py
from django.contrib import auth, messages
from django.contrib.auth import get_user_model
from django.contrib.auth.hashers import make_password
from django.contrib.auth.tokens import default_token_generator
from django.contrib.sites.shortcuts import get_current_site
from django.http import Http404, HttpResponseForbidden
from django.shortcuts import get_object_or_404, redirect
from django.urls import reverse
from django.utils.decorators import method_decorator
from django.utils.http import base36_to_int, int_to_base36
from django.utils.translation import gettext_lazy as _
from django.views.decorators.cache import never_cache
from django.views.decorators.csrf import csrf_protect
from django.views.decorators.debug import sensitive_post_parameters
from django.views.generic.base import TemplateResponseMixin, View
from django.views.generic.edit import FormView
from account import signals
from account.conf import settings
from account.forms import (
ChangePasswordForm,
LoginUsernameForm,
PasswordResetForm,
PasswordResetTokenForm,
SettingsForm,
SignupForm,
)
from account.hooks import hookset
from account.mixins import LoginRequiredMixin
from account.models import (
Account,
AccountDeletion,
EmailAddress,
EmailConfirmation,
PasswordHistory,
SignupCode,
)
from account.utils import default_redirect, get_form_data
class PasswordMixin(object):
"""
Mixin handling common elements of password change.
Required attributes in inheriting class:
form_password_field - example: "password"
fallback_url_setting - example: "ACCOUNT_PASSWORD_RESET_REDIRECT_URL"
Required methods in inheriting class:
get_user()
change_password()
after_change_password()
get_redirect_field_name()
"""
redirect_field_name = "next"
messages = {
"password_changed": {
"level": messages.SUCCESS,
"text": _("Password successfully changed.")
}
}
def get_context_data(self, **kwargs):
ctx = super(PasswordMixin, self).get_context_data(**kwargs)
redirect_field_name = self.get_redirect_field_name()
ctx.update({
"redirect_field_name": redirect_field_name,
"redirect_field_value": self.request.POST.get(redirect_field_name, self.request.GET.get(redirect_field_name, "")),
})
return ctx
def change_password(self, form):
user = self.get_user()
user.set_password(form.cleaned_data[self.form_password_field])
user.save()
return user
def after_change_password(self):
user = self.get_user()
signals.password_changed.send(sender=self, user=user)
if settings.ACCOUNT_NOTIFY_ON_PASSWORD_CHANGE:
self.send_password_email(user)
if self.messages.get("password_changed"):
messages.add_message(
self.request,
self.messages["password_changed"]["level"],
self.messages["password_changed"]["text"]
)
def get_redirect_field_name(self):
return self.redirect_field_name
def get_success_url(self, fallback_url=None, **kwargs):
if fallback_url is None:
fallback_url = getattr(settings, self.fallback_url_setting, None)
kwargs.setdefault("redirect_field_name", self.get_redirect_field_name())
return default_redirect(self.request, fallback_url, **kwargs)
def send_password_email(self, user):
protocol = getattr(settings, "DEFAULT_HTTP_PROTOCOL", "http")
current_site = get_current_site(self.request)
ctx = {
"user": user,
"protocol": protocol,
"current_site": current_site,
}
hookset.send_password_change_email([user.email], ctx)
def create_password_history(self, form, user):
if settings.ACCOUNT_PASSWORD_USE_HISTORY:
password = form.cleaned_data[self.form_password_field]
PasswordHistory.objects.create(
user=user,
password=make_password(password)
)
class SignupView(PasswordMixin, FormView):
template_name = "account/signup.html"
template_name_ajax = "account/ajax/signup.html"
template_name_email_confirmation_sent = "account/email_confirmation_sent.html"
template_name_email_confirmation_sent_ajax = "account/ajax/email_confirmation_sent.html"
template_name_signup_closed = "account/signup_closed.html"
template_name_signup_closed_ajax = "account/ajax/signup_closed.html"
form_class = SignupForm
form_kwargs = {}
form_password_field = "password"
redirect_field_name = "next"
identifier_field = "username"
messages = {
"email_confirmation_sent": {
"level": messages.INFO,
"text": _("Confirmation email sent to {email}.")
},
"invalid_signup_code": {
"level": messages.WARNING,
"text": _("The code {code} is invalid.")
}
}
fallback_url_setting = "ACCOUNT_SIGNUP_REDIRECT_URL"
def __init__(self, *args, **kwargs):
self.created_user = None
kwargs["signup_code"] = None
super(SignupView, self).__init__(*args, **kwargs)
@method_decorator(sensitive_post_parameters())
@method_decorator(csrf_protect)
@method_decorator(never_cache)
def dispatch(self, request, *args, **kwargs):
self.request = request
self.args = args
self.kwargs = kwargs
self.setup_signup_code()
return super(SignupView, self).dispatch(request, *args, **kwargs)
def setup_signup_code(self):
code = self.get_code()
if code:
try:
self.signup_code = SignupCode.check_code(code)
except SignupCode.InvalidCode:
self.signup_code = None
self.signup_code_present = True
else:
self.signup_code = None
self.signup_code_present = False
def get(self, *args, **kwargs):
if self.request.user.is_authenticated:
return redirect(default_redirect(self.request, settings.ACCOUNT_LOGIN_REDIRECT_URL))
if not self.is_open():
return self.closed()
return super(SignupView, self).get(*args, **kwargs)
def post(self, *args, **kwargs):
if self.request.user.is_authenticated:
raise Http404()
if not self.is_open():
return self.closed()
return super(SignupView, self).post(*args, **kwargs)
def get_initial(self):
initial = super(SignupView, self).get_initial()
if self.signup_code:
initial["code"] = self.signup_code.code
if self.signup_code.email:
initial["email"] = self.signup_code.email
return initial
def get_template_names(self):
if self.request.is_ajax():
return [self.template_name_ajax]
else:
return [self.template_name]
def get_form_kwargs(self):
kwargs = super(SignupView, self).get_form_kwargs()
kwargs.update(self.form_kwargs)
return kwargs
def form_invalid(self, form):
signals.user_sign_up_attempt.send(
sender=SignupForm,
username=get_form_data(form, self.identifier_field),
email=get_form_data(form, "email"),
result=form.is_valid()
)
return super(SignupView, self).form_invalid(form)
def form_valid(self, form):
self.created_user = self.create_user(form, commit=False)
# prevent User post_save signal from creating an Account instance
# we want to handle that ourself.
self.created_user._disable_account_creation = True
self.created_user.save()
self.use_signup_code(self.created_user)
email_address = self.create_email_address(form)
if settings.ACCOUNT_EMAIL_CONFIRMATION_REQUIRED and not email_address.verified:
self.created_user.is_active = False
self.created_user.save()
self.create_account(form)
self.create_password_history(form, self.created_user)
self.after_signup(form)
if settings.ACCOUNT_EMAIL_CONFIRMATION_EMAIL and not email_address.verified:
self.send_email_confirmation(email_address)
if settings.ACCOUNT_EMAIL_CONFIRMATION_REQUIRED and not email_address.verified:
return self.email_confirmation_required_response()
else:
show_message = [
settings.ACCOUNT_EMAIL_CONFIRMATION_EMAIL,
self.messages.get("email_confirmation_sent"),
not email_address.verified
]
if all(show_message):
messages.add_message(
self.request,
self.messages["email_confirmation_sent"]["level"],
self.messages["email_confirmation_sent"]["text"].format(**{
"email": form.cleaned_data["email"]
})
)
# attach form to self to maintain compatibility with login_user
# API. this should only be relied on by d-u-a and it is not a stable
# API for site developers.
self.form = form
self.login_user()
return redirect(self.get_success_url())
def create_user(self, form, commit=True, model=None, **kwargs):
User = model
if User is None:
User = get_user_model()
user = User(**kwargs)
username = form.cleaned_data.get("username")
if username is None:
username = self.generate_username(form)
user.username = username
user.email = form.cleaned_data["email"].strip()
password = form.cleaned_data.get("password")
if password:
user.set_password(password)
else:
user.set_unusable_password()
if commit:
user.save()
return user
def create_account(self, form):
return Account.create(request=self.request, user=self.created_user, create_email=False)
def generate_username(self, form):
raise NotImplementedError(
"Unable to generate username by default. "
"Override SignupView.generate_username in a subclass."
)
def create_email_address(self, form, **kwargs):
kwargs.setdefault("primary", True)
kwargs.setdefault("verified", False)
if self.signup_code:
kwargs["verified"] = self.created_user.email == self.signup_code.email if self.signup_code.email else False
return EmailAddress.objects.add_email(self.created_user, self.created_user.email, **kwargs)
def use_signup_code(self, user):
if self.signup_code:
self.signup_code.use(user)
def send_email_confirmation(self, email_address):
email_address.send_confirmation(site=get_current_site(self.request))
def after_signup(self, form):
signals.user_signed_up.send(sender=SignupForm, user=self.created_user, form=form)
def login_user(self):
user = auth.authenticate(**self.user_credentials())
auth.login(self.request, user)
self.request.session.set_expiry(0)
def user_credentials(self):
return hookset.get_user_credentials(self.form, self.identifier_field)
def get_code(self):
return self.request.POST.get("code", self.request.GET.get("code"))
def is_open(self):
if self.signup_code:
return True
else:
if self.signup_code_present:
if self.messages.get("invalid_signup_code"):
messages.add_message(
self.request,
self.messages["invalid_signup_code"]["level"],
self.messages["invalid_signup_code"]["text"].format(**{
"code": self.get_code(),
})
)
return settings.ACCOUNT_OPEN_SIGNUP
def email_confirmation_required_response(self):
if self.request.is_ajax():
template_name = self.template_name_email_confirmation_sent_ajax
else:
template_name = self.template_name_email_confirmation_sent
response_kwargs = {
"request": self.request,
"template": template_name,
"context": {
"email": self.created_user.email,
"success_url": self.get_success_url(),
}
}
return self.response_class(**response_kwargs)
def closed(self):
if self.request.is_ajax():
template_name = self.template_name_signup_closed_ajax
else:
template_name = self.template_name_signup_closed
response_kwargs = {
"request": self.request,
"template": template_name,
}
return self.response_class(**response_kwargs)
class LoginView(FormView):
template_name = "account/login.html"
template_name_ajax = "account/ajax/login.html"
form_class = LoginUsernameForm
form_kwargs = {}
redirect_field_name = "next"
@method_decorator(sensitive_post_parameters())
@method_decorator(csrf_protect)
@method_decorator(never_cache)
def dispatch(self, *args, **kwargs):
return super(LoginView, self).dispatch(*args, **kwargs)
def get(self, *args, **kwargs):
if self.request.user.is_authenticated:
return redirect(self.get_success_url())
return super(LoginView, self).get(*args, **kwargs)
def get_template_names(self):
if self.request.is_ajax():
return [self.template_name_ajax]
else:
return [self.template_name]
def get_context_data(self, **kwargs):
ctx = super(LoginView, self).get_context_data(**kwargs)
redirect_field_name = self.get_redirect_field_name()
ctx.update({
"redirect_field_name": redirect_field_name,
"redirect_field_value": self.request.POST.get(redirect_field_name, self.request.GET.get(redirect_field_name, "")),
})
return ctx
def get_form_kwargs(self):
kwargs = super(LoginView, self).get_form_kwargs()
kwargs.update(self.form_kwargs)
return kwargs
def form_invalid(self, form):
signals.user_login_attempt.send(
sender=LoginView,
username=get_form_data(form, form.identifier_field),
result=form.is_valid()
)
return super(LoginView, self).form_invalid(form)
def form_valid(self, form):
self.login_user(form)
self.after_login(form)
return redirect(self.get_success_url())
def after_login(self, form):
signals.user_logged_in.send(sender=LoginView, user=form.user, form=form)
def get_success_url(self, fallback_url=None, **kwargs):
if fallback_url is None:
fallback_url = settings.ACCOUNT_LOGIN_REDIRECT_URL
kwargs.setdefault("redirect_field_name", self.get_redirect_field_name())
return default_redirect(self.request, fallback_url, **kwargs)
def get_redirect_field_name(self):
return self.redirect_field_name
def login_user(self, form):
auth.login(self.request, form.user)
expiry = settings.ACCOUNT_REMEMBER_ME_EXPIRY if form.cleaned_data.get("remember") else 0
self.request.session.set_expiry(expiry)
class LogoutView(TemplateResponseMixin, View):
template_name = "account/logout.html"
redirect_field_name = "next"
@method_decorator(never_cache)
def dispatch(self, *args, **kwargs):
return super(LogoutView, self).dispatch(*args, **kwargs)
def get(self, *args, **kwargs):
if not self.request.user.is_authenticated:
return redirect(self.get_redirect_url())
ctx = self.get_context_data()
return self.render_to_response(ctx)
def post(self, *args, **kwargs):
if self.request.user.is_authenticated:
auth.logout(self.request)
return redirect(self.get_redirect_url())
def get_context_data(self, **kwargs):
ctx = kwargs
redirect_field_name = self.get_redirect_field_name()
ctx.update({
"redirect_field_name": redirect_field_name,
"redirect_field_value": self.request.POST.get(redirect_field_name, self.request.GET.get(redirect_field_name, "")),
})
return ctx
def get_redirect_field_name(self):
return self.redirect_field_name
def get_redirect_url(self, fallback_url=None, **kwargs):
if fallback_url is None:
fallback_url = settings.ACCOUNT_LOGOUT_REDIRECT_URL
kwargs.setdefault("redirect_field_name", self.get_redirect_field_name())
return default_redirect(self.request, fallback_url, **kwargs)
【问题讨论】: