我使用user.userprofile中的信息来管理权限。
我如何使用
# List of status
STATUS_CHOICES = (
('teacher', 'Teacher'),
('student', 'Student'),
)
# More field for an user.
class UserProfile(models.Model):
user = models.OneToOneField(User, unique=True)
status = models.CharField(max_length=10, choices=STATUS_CHOICES, default='student')
现在,在一个视图中,我有例子:
# Only the owner view this template
if request.user.userprofile.status != 'teacher':
return redirect('Penelope.views.home')
我是如何测试的:
def login_function(self, username, password, status):
# Create a new user
user = User.objects.create_user(username=username, password=password)
user.userprofile.status = status
user.save()
# Use test client to perform login
user = self.client.login(username=username, password=password)
response = self.client.post('/login/')
class LoggedAsTeacherCase(TestCase):
def setUp(self):
# I create and log with a teacher user
login_function(self, 'teststudent', 'password', 'teacher')
def test_login(self): # Verify if login has been validated by server
response = self.client.get('/login/')
self.assertRedirects(response, '/') # <<< It is ok (My user is detected as connected, he is redirected)
def test_dashboard(self):
response = self.client.get('/')
self.assertEqual(response.status_code, 200) # <<< It is ok (Confirmation, my user is not redirected to login url, perfect)
def test_newcourse(self):
response = self.client.get('/newcourse/')
self.assertEqual(response.status_code, 200) # <<< /!\ It is false, I have a redirection (302), not a 200...
所以,这意味着当视图测试用户是否是教师时(参见:我的主题的顶部),它发送了False ......
如何访问此信息并执行测试?
答案 0 :(得分:2)
您对status
字段的定义不正确。
CharFields需要一个&#34; max_length&#34;属性为正整数。
将其更改为以下内容:
models.CharField(max_length=..., choices=STATUS_CHOICES)
另见here
答案 1 :(得分:0)
我发现了问题!
user = User.objects.create_user(username=username, password=password)
user.userprofile.status = status
user.save()
当我这样做时,我认为user = User.objects.create_user(username=username, password=password)
会返回一个用户(false)。
所以,我必须提出要求:
user = User.objects.create_user(username=username, password=password)
test = UserProfile.objects.filter(user=username)
test.status = status
test.save()
没关系!