python - 属性错误:必须在测试中使用 URLconf 中的对象 pk 或 slug 调用通用详细信息视图
问题描述
我今天花了很多时间查看其他在此处和整个 Google 中引用此问题的帖子。但是,当这种情况发生在测试中时,我无法找到解决方案。我在我的项目中使用 pytest 并且仅在测试视图时在我的一个详细视图中出现此错误。该视图本身适用于我的实际站点。这是我的代码:
视图.py
class CarrierDetailView(LoginRequiredMixin, DetailView):
model = Carrier
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
quotes = self.object.quotes.all()
context['quotes'] = quotes
return context
模型.py
class Carrier(models.Model):
TYPE_CHOICES = [
('WYO', 'WYO'),
('PRIVATE', 'Private')
]
carrier_name = models.CharField(max_length=50)
carrier_type = models.CharField(max_length=7, choices=TYPE_CHOICES)
def __str__(self):
return self.carrier_name
网址.py
path('carrier/<int:pk>/', views.CarrierDetailView.as_view(), name='carrier-detail'),
和 test_views.py
class CarrierDetailViewTest(TestCase):
def test_carrier_detail_view(self):
self.factory = RequestFactory()
self.carrier = models.Carrier.objects.create(carrier_name='NatGen', carrier_type='WYO', id=2)
path = reverse('quote-checklist:carrier-detail', kwargs={'pk':2})
request = RequestFactory().get(path)
request.user = User.objects.create_user(username='ryan', email='ryan@email.com', password='password')
response = views.CarrierDetailView.as_view()(request, kwargs={'pk':2})
assert response.status_code == 200
def test_carrier_detail_template(self):
assert('carrier_detail.html')
请注意,在测试中,我在响应/路径中的 kwargs 和没有的情况下都收到了这个错误。我还使用以下测试代码成功测试了此视图的 url:
def test_carrier_detail_view_url(self):
path = reverse('quote-checklist:carrier-detail', kwargs={'pk':1})
assert resolve(path).view_name == 'quote-checklist:carrier-detail'
我提前感谢其他人可能提供的任何见解。
解决方案
答案原来是 bdbd 的建议。我改变了我的回应
response = views.CarrierDetailView.as_view()(request, **{'pk':2})
感谢您的帮助!
推荐阅读
- c++ - 从向量中擦除元素(hackerrank)
- python - 带有日期的 Pandas DataFrame 中的字典
- javascript - 使用 Moment.js 将 2 个日期之间的差异转换为 'y mod d' 格式
- javascript - 动态更改和保存文本框中的内容
- bash - Bash argument input changes?
- elasticsearch-aggregation - NEST (ElasticSearch) Terms Aggregation does not acknowledge the Query
- blazor - Could not find 'BlazorInputFile' in 'window'
- reactjs - React Material UI - Override using withStyles
- java - Error: Could not find or load main class MakePhoneCall Caused by: java.lang.ClassNotFoundException: MakePhoneCall
- mysql - 使用Mysql统计年级数