django-单击href链接会将我重定向到索引页,而不是指向的网页
İ将pinax django用户帐户安装到我的项目中,并按照说明快速使用。在安装包后,迁移工作非常顺利,但当我将href链接安排到注册和登录页面时,它会将我重定向到主页 我想我遗漏了一些非常基本的东西,我需要帮助。。下面您可以看到我的url映射和href链接 main.urldjango-单击href链接会将我重定向到索引页,而不是指向的网页,django,pinax,Django,Pinax,İ将pinax django用户帐户安装到我的项目中,并按照说明快速使用。在安装包后,迁移工作非常顺利,但当我将href链接安排到注册和登录页面时,它会将我重定向到主页 我想我遗漏了一些非常基本的东西,我需要帮助。。下面您可以看到我的url映射和href链接 main.url from django.contrib import admin from django.urls import path from django.conf.urls import url,include from zet
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.url(出于url目的,我只包括app_名称)
视图是什么样子的?登录的装饰器是否正确
如果运行站点并检查页脚中生成的URL,它们是否正确?(在chrome press f12中,然后找到元素中的链接。)好吧,这是一个新手犯的错误,我将把这篇文章留给其他人
只需从管理面板中注销,出于测试目的,打开一个私人浏览会话,并在那里使用您的第二个“用户”。hi cristopher。我用views.py编辑了正文,还添加了链接。。他们看起来不错,不是吗?仍然困惑
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"),
]
<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>
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)