登录时检查配置文件Django不支持

2024-09-28 23:31:21 发布

您现在位置:Python中文网/ 问答频道 /正文

在我的项目中,我有两种配置文件:“Student”和“Professor”,在这两种模型中,我声明一个@属性,如下所示:

class Professor(User):
    user = models.OneToOneField(User, on_delete=models.CASCADE,   primary_key=True)
    birthday = models.DateField("Data de Nascimento")
    sexChoices = (
        (u"1", "Masculino"),
        (u"2", "Feminino"),
    )
    sex = models.CharField(max_length = 1, choices = sexoChoices, default = u"1")

    def __str__(self):
        return self.user.username

    @property
    def perf(self):
    """ This property call the profile name """
        return '%s' % 'Professor'        

之后,我创建了一个方法调用get\u profile(),如下所示:

def get_profile(user):
""" defines the kind of profile
Example: 
    from roles.models import *
    user = User.objects.all()
    profile = get_profile(user[1])
    profile.perfil
"""
    try:
        professor = Professor.objects.get(username=user.username)
        return professor
    except:
        pass

    try:
        student = Student.objects.get(username=user.username)
        return student
    except:
        pass

    return user       

在我的登录视图中,我尝试呈现不同的html,为此,我使用get\u profile()和perf属性,如下所示:

class LoginValidator(View):

    def post(self, request,  **kwargs):

    username = request.POST['username']
    password = request.POST['password']
    user = authenticate(request, username=username, password=password)

    if user is not None:
        if user.is_active:
            login(request, user)
            messages.success(request, 'Logado com sucesso')
            if( get_profile(user).perf  == 'Professor'):
                return render(request,'professor/home.html')

            return render(request,'student/home.html')

    else:
        messages.error(request, 'Usuário não encontrado')   

所以我的问题是:为什么这种方法不起作用?有更好的方法来实现这一点吗?你知道吗

我对其他的方法也很满意。你知道吗

你知道吗Obs:。我使用的是django1.11和python3.5.2


Tags: 方法selfgetreturnobjectsmodelsrequestdef
1条回答
网友
1楼 · 发布于 2024-09-28 23:31:21

使用hasattr()属性可以很好地处理OneToOneField。see here in doc

只要把这段代码放到你的型号.py你知道吗

def get_profile(self):
    if(hasattr(self, 'profile')):
        return self.profile
    return None

注意: 你用的是教授,作为一个单独的领域。我在这里使用的是profile,因为我假设有不止一种类型的模型,一种是professor。另外,我在您的profile字段中没有看到相关的\u name属性。将相关的\u name属性设置为:

 user = models.OneToOneField(User, on_delete=models.CASCADE,   primary_key=True, related_name = 'profile')

引用文档:您还可以使用hasattr来避免异常捕获的需要:

此方法将用于用户模型对象。这是因为用户模型对象与配置文件模型对象具有一对一的关系。 希望这有帮助。谢谢。你知道吗

相关问题 更多 >