【问题标题】:Django Reverse relation in template renders sporadically模板中的Django反向关系偶尔呈现
【发布时间】:2016-07-28 20:28:36
【问题描述】:

在功能测试中使用 Selenium 渲染模板时,我得到了不同的结果。正常访问该页面,我看到正在呈现的对象。在功能测试期间,页面是空白的(它甚至不会呈现空子句中的文本。)我编写了一个小型 Django 应用程序来测试它并确保我不会发疯,并且我得到了同样的结果问题一直存在。

模型:

class M(models.Model):
    pass


class N(models.Model):
    m = models.ForeignKey(
        M,
        null=True,
        default=None,
        )

观点:

def view_my_problem(request):
    ms = M.objects.all()
    context = {'ms': ms}
    return render(request, 'my_problem_template.html', context)

模板:

<html>
    {% for m in ms %}
        {% for n in m.n_set.all %}
            {{ n }}
        {% empty %}
            THIS IS EMPTY
        {% endfor %}
    {% endfor %}
</html>

并且测试有问题(失败,“AssertionError: 'N object' not found in ''”):

class FunctionalTest(StaticLiveServerTestCase):

    @classmethod
    def setUpClass(cls):
        for arg in sys.argv:
            if 'liveserver' in arg:
                cls.server_url = 'http://' + arg.split('=')[1]
                return
        super().setUpClass()
        cls.server_url = cls.live_server_url

    @classmethod
    def tearDownClass(cls):
        if cls.server_url == cls.live_server_url:
            super().tearDownClass()

    def setUp(self):
        self.browser = webdriver.Firefox()
        self.browser.implicitly_wait(10)

    def tearDown(self):
        self.browser.close()

    def test_my_problem(self):
        m = M()
        m.save()
        n = N(m=m)
        n.save()
        self.assertEqual(N.objects.count(), 1)
        self.assertEqual(M.objects.count(), 1)
        self.assertEqual(m.n_set.count(), 1)
        text = self.browser.find_element_by_tag_name('html').text
        self.assertIn('N object', text)

但是在测试中手动渲染模板可以正常工作。并且像平常一样访问页面(不是在运行测试时)也可以正常工作。我可以提前在视图中组合值,然后迭代常量,但我很好奇为什么这不起作用。这是怎么回事?

【问题讨论】:

  • 但是当你进行测试时它会呈现什么?
  • @ShangWang 上面,我说它失败了“AssertionError: 'N object' not found in ''”。所以它用一个空白字符串呈现。 (它希望找到 'N object',但找到了 ''。)(编辑:正如 Vladmir 在下面指出的那样,我实际上错过了获取 url。因此,我无法重现我的软件在此示例中遇到的问题。我的错误。)

标签: python django selenium


【解决方案1】:
self.browser.get(self.live_server_url)
text = ...

【讨论】:

  • 好吧,我觉得自己很笨。我以为我正在重现我的软件存在的问题,但我只是产生了一个不同的问题。谢谢。
猜你喜欢
  • 2015-09-13
  • 2017-06-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-27
相关资源
最近更新 更多