django - Django 自定义用户函数
问题描述
我按如下方式创建了一个 CustomUser,但是,当我调用 CustomUser.get_first_name() 时,我收到错误消息“get_first_name() missing 1 required positional argument: 'self'”,因此无法在视图中使用 CustomUser 函数。我检查了我的 settings.py 并导入了自定义用户、模型以及视图文件中的设置。如果你能在这里帮助我,那就太棒了。
模型.py
class CustomUser(AbstractBaseUser, PermissionsMixin):
email = models.EmailField(verbose_name='email', unique=True)
first_name = models.CharField(verbose_name='first_name', max_length = 15)
last_name = models.CharField(verbose_name='last_name', max_length = 15)
organization = models.CharField(verbose_name="organization", max_length = 15, choices=ORGANIZATIONS)
is_staff = models.BooleanField(default=False)
is_active = models.BooleanField(default=True) # check this for login email purposes
date_joined = models.DateTimeField(default=timezone.now)
USERNAME_FIELD = 'email'
REQUIRED_FIELDS = ['first_name', 'last_name', 'organization']
objects = CustomUserManager()
def get_full_name(self):
'''
Returns the first_name plus the last_name, with a space in between.
'''
full_name = '%s %s' % (self.first_name, self.last_name)
return full_name.strip()
def get_short_name(self):
'''
Returns the short name for the user.
'''
return self.first_name
def __str__(self):
return self.email
def get_organization(self):
return self.organization
def get_first_name(self):
return self.first_name
def get_email(self):
return self.email
视图.py
class Dashboard(LoginRequiredMixin, TemplateView):
template_name = "plot.html"
def get_context_data(self, **kwargs):
# Call the base implementation first to get a context
context = super(Dashboard, self).get_context_data(**kwargs)
context['plot'] = plots.plotsurvey()
return context
情节.py
def plotsurvey():
c = CustomUser()
name = c.get_first_name()
df = pd.read_csv(str(name) +'.csv') #
trace = go.Bar(
x = df['Y'],
y = df['Z'], name = 'N'
)
data = [trace]
layout = go.Layout(title="X", margin = dict(b = 150))
fig = go.Figure(data=data, layout=layout)
plot_div = plot(fig, output_type='div', include_plotlyjs=False)
#logger.info("Plotting number of points {}.".format(3))
return plot_div
解决方案
您正在使用实例方法,就好像它是类方法一样。
你需要改变,这
def plotsurvey():
c = CustomUser()
name = CustomUser.get_first_name()
...
为此(使用实例)
def plotsurvey():
c = CustomUser()
name = c.get_first_name()
...
请注意,这里还有另一个问题。您实际上并没有获得任何真正的用户c = CustomUser()
。要获得用户,您需要执行类似的操作
CustomUser.objects.get(pk=user_id)
在这种情况下,您最终得到:
def plotsurvey(user_id):
c = CustomUser.objects.get(pk=user_id)
name = c.get_first_name()
...
编辑
我们可以更实际,使用视图。
class Dashboard(LoginRequiredMixin, TemplateView):
template_name = "plot.html"
def get_context_data(self, **kwargs):
# Call the base implementation first to get a context
context = super(Dashboard, self).get_context_data(**kwargs)
user = self.request.user
context['plot'] = plots.plotsurvey(user.pk)
return context
推荐阅读
- c# - 尝试关联两个模型时未将对象引用设置为对象的实例
- r - R - 使用其他矩阵中的过滤器获取矩阵的值
- javascript - contenteditable 中的 JS 正则表达式匹配 URL 不适用于 www.*
- python - 如何使用逗号和 & 将列表转换为可读格式?
- javascript - AlpineJS x 数据被覆盖
- macos - 如何在 M1 Mac 上从源代码构建 pytorch?
- kubernetes - Kubernetes 部署工作时间分析
- debian - 如何在 Debian 10 启动时禁用自动 Viber 启动?
- reactjs - React - Azure AD B2C - 注销问题
- sql - Oracle SQL - 根据标准删除记录子集