Django测试无法使用主键

Django测试无法使用主键,django,django-testing,Django,Django Testing,test.py 当我运行这段代码时,它返回django.url.exceptions.NoReverseMatch:Reverse for'blogpost'with arguments'(None,)'not found。尝试了1个模式:['blogapp/post/(?P[0-9]+)/$”]但正如您在my URL.py中看到的,当我使用args=[1]时,它返回404=二百 from django.test import TestCase, Client, SimpleTestCase f

test.py

当我运行这段代码时,它返回
django.url.exceptions.NoReverseMatch:Reverse for'blogpost'with arguments'(None,)'not found。尝试了1个模式:['blogapp/post/(?P[0-9]+)/$”]
但正如您在my URL.py中看到的,当我使用args=[1]时,它返回404=二百

from django.test import TestCase, Client, SimpleTestCase
from django.urls import reverse, resolve
from .models import BlogappModel
from django.contrib.auth import get_user_model
from .views import Blogapphome, Blogpostview

class TestUrls(SimpleTestCase):

    def test_list_view_url(self):
        url = reverse('blogapp')
        self.assertEqual( resolve(url).func.view_class, Blogapphome)

    def test_detail_view_url(self):
        url = reverse('blogpost', args=[1,])
        self.assertEqual( resolve(url).func.view_class, Blogpostview)

class BlogTest(TestCase):

   def setUp(self):

        self.user = get_user_model().objects.create(
            username='testuser',
            email='test@gamil.com',
            password='secrete'
        )

        self.post = BlogappModel(
            title='testing', 
            author=self.user, 
            post='bla bla bla',
        )

    def test_post_detail_view(self):

        response = self.client.get(reverse('blogpost', args=[self.post.pk]))

        self.assertEqual(response.status_code , 200)

        print('All tests are successful')

urlpatterns=[
路径(“”,views.Blogapphome.as_view(),name='blogapp'),
路径('post/',views.Blogpostview.as_view(),name='blogpost')
]

第二条路径指向该url,但为什么它在test.py中不起作用,

您应该首先创建一个
Blog
对象,然后使用该对象的主键:

urlpatterns = [
    path('', views.Blogapphome.as_view(), name='blogapp'),
    path('post/<int:pk>/', views.Blogpostview.as_view(), name='blogpost')
]
类测试URL(SimpleTestCase):
# …
def设置(自):
# …
self.post=BlogappModel.objects.create(
title='testing',
author=self.user,
post='bla bla',
)
def测试\详细信息\视图\ url(自):
url=reverse('blogpost',args=[self.blog.pk])

self.assertEqual(resolve(url).func.view\u class,Blogpostview)
很抱歉,我在那个类中有setUp函数,我忘了将它添加为`setUp(self):self.user=BlogappModel.objects.create()``当我在args中使用它时,它会返回`self.user.pk'None@deepeshjha:但您应该使用
self.post.pk
,不是
self.user.pk
,因为
pk
(通常)处理的是
Blog
对象的主键,而不是用户。我是这样做的,但它仍然不工作,我只是更新了上面的代码。请您再次检查。@deepeshjha:您没有在数据库端创建它。您只构建了一个对象,但没有将其保存到数据库中。哦,现在我得到了它,如果我在setUp()的末尾添加self.post.save(),它会工作的,它确实工作了。谢谢你正在设置中创建博客帖子吗?是的,我正在创建博客帖子,这样我可以创建更多的测试来检查其内容。
class TestUrls(SimpleTestCase):

    # …

    def setUp(self):
        # …
        self.post = BlogappModel.objects.create(
            title='testing', 
            author=self.user, 
            post='bla bla bla',
        )

    def test_detail_view_url(self):
        url = reverse('blogpost', args=[self.blog.pk,])
        self.assertEqual( resolve(url).func.view_class, Blogpostview)