在我的项目中,我有两种配置文件:“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
使用hasattr()属性可以很好地处理OneToOneField。see here in doc
只要把这段代码放到你的型号.py你知道吗
注意: 你用的是教授,作为一个单独的领域。我在这里使用的是profile,因为我假设有不止一种类型的模型,一种是professor。另外,我在您的profile字段中没有看到相关的\u name属性。将相关的\u name属性设置为:
引用文档:您还可以使用hasattr来避免异常捕获的需要:
此方法将用于用户模型对象。这是因为用户模型对象与配置文件模型对象具有一对一的关系。 希望这有帮助。谢谢。你知道吗
相关问题 更多 >
编程相关推荐