Ошибка атрибута: 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})

Спасибо за помощь!

Вернуться на верх