首页 > 解决方案 > 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

标签: djangopython-3.xdjango-rest-framework

解决方案


您正在使用实例方法,就好像它是类方法一样。

你需要改变,这

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

推荐阅读