Ошибка атрибута: Generic Detail View должен вызываться либо с объектом pk, либо со slug в URLconf в тестах
Сегодня я потратил много времени на просмотр других сообщений, в которых упоминается эта проблема, как здесь, так и в Google. Однако я не могу найти решение, когда это происходит в тесте. Я использую pytest в своем проекте и получаю эту ошибку на одном из моих детальных представлений только при тестировании представления. Само представление работает на моем реальном сайте. Вот мой код:
views.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
models.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
urls.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 в response/path, так и без них. Я также успешно протестировал 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'
Я заранее благодарен за любое мнение, которое могут предложить другие.
Попробуйте изменить quotes = self.object.quotes.all()
на quotes = self.get_object().quotes.all()
Ответом оказалось предложение bdbd. Я изменил свой ответ на
response = views.CarrierDetailView.as_view()(request, **{'pk':2})
Спасибо за помощь!