为什么通过我自己的视图登录后,用户登录到管理站点而不是我的视图?姜戈
Why, after login by my own view, user is logged in on admin site but not on my views? Django
在某些情况下,我想检查我的应用程序是否可以在生产环境中运行。
当我在本地启动应用程序时,一切正常, 但是在 production 上,当我使用我的登录表单时,用户登录到 django 管理站点,但在我的用户详细信息视图和另一个视图中,在模板中我使用 request.user
我在 {% url '' %}
标签中有错误 exception.NoReverseMatch
,因为 request.user
是 None
.
我假设用户未通过身份验证,但为什么呢?
我的表格:
class LoginForm(LoginForm):
def clean(self):
super(LoginForm, self).clean()
if not self.user.is_active or self.user.is_deleted:
raise forms.ValidationError(self.error_messages['account_inactive'])
return self.cleaned_data
我的看法:
class LoginView(LoginView):
form_class = LoginForm
login_view = LoginView.as_view()
这是我的网址:
app_name = "users"
urlpatterns = [
path("redirect/", view=user_redirect_view, name="redirect"),
path("<int:pk>/update/", view=user_update_view, name="update"),
path("change_password", view=user_password_change_view, name="password_change"),
path("<int:pk>/remove-user", view=user_remove_from_company_view, name="remove_user"),
path("<int:pk>/update-role", view=profile_update_role, name="update_role"),
path("<int:pk>/", view=user_detail_view, name="detail"),
path("sign_up/", view=registration_view, name="registration"),
]
我的用户模型:
class User(AbstractBaseUser, PermissionsMixin):
email = models.EmailField(
verbose_name=_('Email address'),
max_length=255,
unique=True,
)
first_name = models.CharField(_('First name'), max_length=20)
last_name = models.CharField(_('Last name'), max_length=20)
is_active = models.BooleanField(_('Active'), default=True)
date_joined = models.DateTimeField(_('Date joined'), auto_now_add=True)
is_deleted = models.BooleanField(_('Deleted'), default=False)
stripe_customer_id = models.CharField(_('Stripe customer id'),
max_length=19, blank=True, default='')
objects = UserManager()
USERNAME_FIELD = 'email'
class Meta:
ordering = ['email']
def get_full_name(self):
return self.email
def get_short_name(self):
return self.email
def __str__(self):
return self.email
def get_absolute_url(self):
return reverse("users:detail", kwargs={"username": self.email})
如果您使用 django-allauth
本地和生产的不同设置,请尝试在您的本地设置中设置:
ACCOUNT_EMAIL_VERIFICATION = "none"
编辑
阅读新评论后,我还建议检查模板 - 也许您在某处引用了错误的对象 - 即您从对象不存在的相关模型调用用户?
几个选项:
- 您是否为管理员和 "your" 视图使用了不同的域(包括端口号)。您还可以检查
sessionid
cookie 是否已设置
- 或者您没有正确检查权限(@KrystianK 请在您的问题中提供示例)
- 否则用户属性有问题
is_staff
、is_superuser
或is_active
在某些情况下,我想检查我的应用程序是否可以在生产环境中运行。
当我在本地启动应用程序时,一切正常, 但是在 production 上,当我使用我的登录表单时,用户登录到 django 管理站点,但在我的用户详细信息视图和另一个视图中,在模板中我使用 request.user
我在 {% url '' %}
标签中有错误 exception.NoReverseMatch
,因为 request.user
是 None
.
我假设用户未通过身份验证,但为什么呢?
我的表格:
class LoginForm(LoginForm):
def clean(self):
super(LoginForm, self).clean()
if not self.user.is_active or self.user.is_deleted:
raise forms.ValidationError(self.error_messages['account_inactive'])
return self.cleaned_data
我的看法:
class LoginView(LoginView):
form_class = LoginForm
login_view = LoginView.as_view()
这是我的网址:
app_name = "users"
urlpatterns = [
path("redirect/", view=user_redirect_view, name="redirect"),
path("<int:pk>/update/", view=user_update_view, name="update"),
path("change_password", view=user_password_change_view, name="password_change"),
path("<int:pk>/remove-user", view=user_remove_from_company_view, name="remove_user"),
path("<int:pk>/update-role", view=profile_update_role, name="update_role"),
path("<int:pk>/", view=user_detail_view, name="detail"),
path("sign_up/", view=registration_view, name="registration"),
]
我的用户模型:
class User(AbstractBaseUser, PermissionsMixin):
email = models.EmailField(
verbose_name=_('Email address'),
max_length=255,
unique=True,
)
first_name = models.CharField(_('First name'), max_length=20)
last_name = models.CharField(_('Last name'), max_length=20)
is_active = models.BooleanField(_('Active'), default=True)
date_joined = models.DateTimeField(_('Date joined'), auto_now_add=True)
is_deleted = models.BooleanField(_('Deleted'), default=False)
stripe_customer_id = models.CharField(_('Stripe customer id'),
max_length=19, blank=True, default='')
objects = UserManager()
USERNAME_FIELD = 'email'
class Meta:
ordering = ['email']
def get_full_name(self):
return self.email
def get_short_name(self):
return self.email
def __str__(self):
return self.email
def get_absolute_url(self):
return reverse("users:detail", kwargs={"username": self.email})
如果您使用 django-allauth
本地和生产的不同设置,请尝试在您的本地设置中设置:
ACCOUNT_EMAIL_VERIFICATION = "none"
编辑
阅读新评论后,我还建议检查模板 - 也许您在某处引用了错误的对象 - 即您从对象不存在的相关模型调用用户?
几个选项:
- 您是否为管理员和 "your" 视图使用了不同的域(包括端口号)。您还可以检查
sessionid
cookie 是否已设置 - 或者您没有正确检查权限(@KrystianK 请在您的问题中提供示例)
- 否则用户属性有问题
is_staff
、is_superuser
或is_active