Reputation: 11
İmplemented pinax django-user-accounts to my project and followed the instructions for quick use.After the package implementation the migrations works perfectly but when i arranged the href links towards sign-up and login page it redirects me to the homepage.
i suppose im missing something very basic, and i need help.. below you can see my url-mappings and the href links..
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(i included only app_name for url purposes)
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"),
]
and href links at html page that supposed to redirect me login and signup page instead of homepage..
<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>
any help and suggestion will be appreciated.I feel really stucked right now, trying to fix this since hours.
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)
Upvotes: 0
Views: 147
Reputation: 11
okey its a really rookie mistake and i'm gonna leave this post for others.
Just log-out from admin panel and for testingt purposes, open a private browsing session and use your 2nd 'user' there.
Upvotes: 0
Reputation: 530
What does the view look like? The decorator for login is correct?
If you run the site and inspect the urls generated in your footer are they correct? (In chrome press f12, then find you link in the elements..)
Upvotes: 0