在Django中通过URL传递静态字符串参数(模型选择)?

时间:2018-04-16 15:27:31

标签: python django django-urls django-testing django-tests

Django 2.0

我有以下型号:

class Visitor(models.Model):
    TYPE_CHOICES = (
        ('P', 'Person'),
        ('E', 'Employee'),
    )
    type = models.CharField(choices=TYPE_CHOICES, max_length=1)
    first_name = models.CharField(max_length=40)
    last_name = models.CharField(max_length=40)
    birth_date = models.DateField()
    street_address = models.CharField(max_length=100)
    city = models.CharField(max_length=40)

在我的网址中,我有以下网址:

# ex: /my_app/P/visit_information/
path('<str:visitor_type>/visit_information/', views.visit_information, name='visit_information'),

我正在尝试为此编写一些测试并遇到问题。

我希望我的测试只是告诉我它是否返回状态200:

def test_parent_visit_information_returns_200(self):
    """
    visit_information page returns a 200
    """
    client = Client()
    response = client.get(reverse('visit_information', args={'visitor_type':'P'}))
    self.assertEqual(response.status_code, 200)

但是我收到以下错误:

visit_information() got an unexpected keyword argument 'visitor_type'

处理反向查找的最佳方法是什么?我怎么能提供'P'或'E',所以它会返回200代码?

我是否在测试中不正确地处理了URL?

已编辑添加

如果我尝试kwargs而不是args,我会看到此错误:

visit_information() got an unexpected keyword argument 'visitor_type'

已编辑添加视图

def visit_information(request):
    return render(request, 'my_app/visit_information.html', {

    })

1 个答案:

答案 0 :(得分:1)

首先,{'visitor_type':'P'}是字典,因此您应该使用kwargs,而不是args

response = client.get(reverse('visit_information', kwargs={'visitor_type':'P'}))

或者,您可以将args与列表一起使用:

response = client.get(reverse('visit_information', args=['P']}))

一旦解决了问题,您就会收到TypeError,因为visit_information视图缺少其签名中的visitor_type。它应该是:

def visit_information(request, visitor_type):
    return render(request, 'my_app/visit_information.html', {})