我在定义自定义用户的Django时遇到问题,在这种情况下,这是Django 2.1中的“ cust”(客户的简称)。我还有其他几种用户类型,其中包含单独的注册表格,可以将它们注册为特定的用户类型。我是从Vitor Freitas撰写的教程“如何使用Django实现多种用户类型” 中构建的,它消除了Django的默认用户管理系统。我的目标是要有一个受保护的视图(客户中心),只有客户才能进入该视图,对于其他用户类型,依此类推。
下面是组成我的项目的错误和代码:
RelatedObjectDoesNotExist位于/ companyusers / cust /
用户没有权限。
File "/home/companysite/.virtualenvs/env/lib/python3.7/site-packages/django/views/generic/edit.py" in get
189. self.object = self.get_object()
File "/home/companysite/companysite/companyusers/views/cust.py" in get_object
38. return self.request.user.cust
File "/home/companysite/.virtualenvs/env/lib/python3.7/site-packages/django/utils/functional.py" in inner
214. return func(self._wrapped, *args)
File "/home/companysite/.virtualenvs/env/lib/python3.7/site-packages/django/db/models/fields/related_descriptors.py" in __get__
414. self.related.get_accessor_name()
Exception Type: RelatedObjectDoesNotExist at /companyusers/cust/
Exception Value: User has no cust.
此文件是我对每种自定义用户类型进行分类的位置(即,我还有2个其他类和布尔值写的相同)。
class User(AbstractUser):
is_cust = models.BooleanField(default=False)
class Cust(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE, related_name='cust', primary_key=True)
这是客户的视图文件,其中包括表单和中心视图。我不确定我是否在正确编写中心视图以验证用户是客户。
class CustSignUpView(CreateView):
model = User
form_class = CustSignUpForm
template_name = 'registration/signup_form.html'
def get_context_data(self, **kwargs):
kwargs['user_type'] = 'cust'
return super().get_context_data(**kwargs)
def form_valid(self, form):
user = form.save()
login(self.request, user)
return redirect('cust:custhub')
@method_decorator([login_required, cust_required], name='dispatch')
class CustHubView(UpdateView):
model = Cust
template_name = 'companyusers/cust/custhub.html'
success_url = reverse_lazy('cust:custhub')
def get_object(self):
return self.request.user.cust
这是我将用户注册为客户的表单文件,我不确定是否将用户类型Boolean更改为该文件。
class CustSignUpForm(UserCreationForm):
class Meta(UserCreationForm.Meta):
model = User
@transaction.atomic
def save(self, commit=True):
user = super().save(commit=False)
user.is_cust = True
if commit:
user.save()
return user
这是我正在调用客户中心视图的URL。
path('cust/', include(([
path('', cust.CustHubView.as_view(), name='custhub'),
], 'companyusers'), namespace='cust')),