首页 > 解决方案 > Django UpdateView 测试时不保存新数据

问题描述

当我在正在运行的服务器上使用我的应用程序来更新现有条目时,它可以工作,但是当我运行测试时它会创建条目,发布它但不会更新字段标题和作者,所以我得到一个断言错误。当我比较正在运行的应用程序更新的打印和测试时,我没有注意到任何差异。

型号

class Book(models.Model):
    title = models.CharField(max_length=120)
    author = models.CharField(max_length=100)
    published = models.IntegerField(validators=[MaxValueValidator(datetime.date.today().year)],
                                    help_text="Use the following format: YYYY")
    isbn_10 = models.CharField(max_length=10, null=True, verbose_name='ISBN_10')
    isbn_13 = models.CharField(max_length=13, null=True, verbose_name='ISBN_13')
    cover_uri = models.CharField(max_length=200)
    language = models.CharField(max_length=56)
    slug = models.SlugField(max_length=120, unique=True, blank=True)

测试:

def test_update_book(self):
    """Create book object and updates fields with correct data"""

    book = Book.objects.create(title='Camera Work 1',
                               author='Alfred Stieglitz',
                               published='2008',
                               isbn_10='',
                               isbn_13='9788389192868',
                               cover_uri='image.jpg',
                               language='english')

    response = self.client.post(
        reverse('books-update', kwargs={'slug': book.slug}),
        {'title': 'The Catcher in the Rye',
         'author': 'J.D. Salinger',
         'published': '2008',
         'isbn_10': '',
         'isbn_13': '9788389192868',
         'cover_uri': 'image.jpg',
         'language': 'english'})

    self.assertEqual(response.status_code, 200)

    book.refresh_from_db()
    print('BOOK', book)
    self.assertEqual(book.author, 'J.D. Salinger')

网址模式:

urlpatterns = [
    path('update/<str:slug>', BookUpdateView.as_view(), name='books-update'),
]

并查看:

class BookUpdateView(UpdateView):
    model = Book
    fields = '__all__'
    success_url = '/'
    template_name = 'books/book_update.html'

    def post(self, request, *args, **kwargs):
        print('POST', request.POST, kwargs)
        return super().post(request, *args, **kwargs)

当我使用我的模板更新该条目时,它可以工作,但是当我运行测试时,它会创建条目,发布它但不更新字段titleauthor所以我得到

一个错误:

AssertionError: 'Alfred Stieglitz' != 'J.D. Salinger'
- Alfred Stieglitz
+ J.D. Salinger

这是测试的打印件

POST <QueryDict: {'title': ['The Catcher in the Rye'], 'author': ['J.D. Salinger'],
 'published': ['2008'], 'isbn_10': [''], 'isbn_13': ['9788389192868'], 'cover_uri': 
['image.jpg'], 'language': ['english']}> {'slug': 'camera-work-1'}

BOOK Camera Work 1, Alfred Stieglitz, 2008

标签: django

解决方案


推荐阅读