我在django中有以下模型。我想做的是让用户登录特定服务并在登录后根据服务类型指导他/她。用户可以拥有最多一项服务,但服务可以拥有多个用户。但是,服务不一定需要用户。因此,我无法与用户模型建立一对一的关系。所以,我添加了第二张表。
我想要的是在用户登录后获取服务的详细信息(ID,名称和服务类型),以便我可以根据类型重定向到右侧视图。
class Service(models.Model):
SERVICE_TYPE = (
('Local', 'Local'),
('External', 'External'),
)
name=models.CharField(max_length=50, unique=True)
serviceNature=models.CharField(max_length=25,choices=SERVICE_TYPE,default='Local')
def __str__(self):
return self.name
class Meta:
ordering=('name',)
class ServiceUser(models.Model):
'''
User to Service
'''
service=models.ForeignKey(Service,related_name='service_user',on_delete=models.CASCADE)
user=models.OneToOneField(User,related_name='user_service',on_delete=models.CASCADE,unique=True)
def __str__(self):
return self.user.username + ', ( ' + self.user.first_name + '), ' + self.service.name
class Meta:
ordering=('service','user')
def myservice(self,user):
#for the given user, return the service name and type, if exists. I failed to attach it here correctly here.
return [self.service.id,self.service.name,self.service.serviceNature]
我能够从管理区域为用户附加服务(用户没有员工或超级状态,因此他们无法通过/ admin区域登录)。现在我在用户登录后遇到问题。在views.py中,我有以下登录信息(我已跳过明显的导入以节省空间):
def login_user(request):
#if form is submitted
form = LoginForm(request.POST or None)
logout(request)
if request.method == 'POST':
#will handle the request later
username = request.POST['login_email']
password = request.POST['login_pwd']
user = authenticate(username=username, password=password)
if user is not None:
if user.is_active:
login(request, user)
#get the department of the user
departmentInfo=ServiceUser.myservice(request.user)
if len(departmentInfo)>0:
#get the service name and type
return HttpResponse('You are logged in to ' + str(departmentInfo[0]) + ' ' + departmentInfo[1])
else:
form=LoginForm(request.Post)
else:
form=LoginForm(request.Post)
else:
form=LoginForm(request.POST)
#returning form
return render(request, 'base.html', {'form':form});
现在它给了我错误:
myservice():缺少1个必要的位置争论1错误。
我知道myservice()方法的实现不正确或者我调用它的方式。
我该怎么做?我基本上想让它尽可能短,所以如果我将登录用户传递给myservice,我需要获得用户所关联的服务。
希望它有意义。
答案 0 :(得分:1)
我不明白my_service
应该做什么,或者为什么它会返回一个列表。此外,它是ServiceUser上的实例方法,但您似乎将其称为类方法。
如果您想从用户转到服务,您可以关注关系:user.user_service.service
。您可以直接在视图中执行此操作;根本不需要那种方法。