我创建了一个包含三个应用程序的小型 django 项目,现在我正在为其中一个编写测试。我需要在不同的视图和不同的模板之间传递一些信息,但这些信息不应该对用户可见。我的第一次尝试是将此信息作为 HTML 表单中的隐藏字段传递,但后来有人指出,这并没有使它完全不可见。所以,我将这些信息存储在 request.session 字典中,一切顺利。
也就是说,我的问题是在测试时出现的。根据django文档(http://docs.djangoproject.com/en/1.2/topics/testing/),当你在测试期间必须修改会话字典时,你应该首先将它存储在一个变量中,修改它,然后保存变量。
所以我的测试代码是这样的:
class Test_Atacar(TestCase):
fixtures = ["testBase.json"]
def test_attack_without_troops(self):
red_player = Player.objects.get(color=RED)
self.failUnless(red_player != None)
session = self.client.session
session["player_id"] = red_player.id
session.save()
response = self.client.get("/espectador/sadfxc/", follow=True)
Run Code Online (Sandbox Code Playgroud)
但是当我运行 python manage.py 测试时,我得到一个 AttributeError,说 dict 没有属性 save()。我在其他地方(http://code.djangoproject.com/ticket/11475)读到,我应该在操作会话之前尝试对任何其他 URL 执行 self.client.get,以便它成为“真实”会话,但是我一直收到相同的 AttributeError。
我创建了视图:
def forgot_password(request):
"""
Actions when user forgot password.
:param request: object
:return: redirect to views.home() or 'loginsys/forgot.html' with form, message
"""
message = None
if request.method == 'POST':
form = ForgotPasswordForm(request.POST)
if form.is_valid():
email = form.cleaned_data['email']
user = User.objects.filter(email=email)
salt = random_salt(len(user[0].username))
code = signing.dumps([user[0].id, user[0].email, user[0].username],
key=settings.SECRET_KEY, salt=salt)
url = settings.SITE_URL + reverse('loginsys:reset', args=[code])
send_email.apply_async(('Welcome', '<p>Hello</p><p><a href="{0}">Go to this link</a></p>'.
format(url), [email]))
store = ForgotPasswordLink()
store.random_salt = salt
store.user_link_id = user[0].id
store.code_value = code
store.save()
forgot_password_salt_life.apply_async((user[0].id, salt), countdown=180) …Run Code Online (Sandbox Code Playgroud)