1

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...

つまり、ビューがユーザーが教師であるかどうかをテストするときに(cf:私の主題の上部を参照)、Falseを送信したことを意味します...

この情報にアクセスしてテストを実行するにはどうすればよいですか?

4

2 に答える 2

2

フィールドの定義statusが正しくありません。CharFieldsには、正の整数である「max_length」属性が必要です。

次のように変更します。

models.CharField(max_length=..., choices=STATUS_CHOICES)

こちらもご覧ください

于 2012-08-24T15:07:53.080 に答える
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()

そしてそれは大丈夫です!

于 2012-09-02T19:45:30.883 に答える