Django AssertionError при тестировании Create View

Я запускаю некоторые тесты для моего приложения "ads", но когда я пытаюсь протестировать CreateView, он терпит неудачу со следующим сообщением:

AssertionError: 'just a test' != 'New title'

Вот тест:

class AdTests(TestCase):
    def setUp(self):
        self.user = get_user_model().objects.create_user(
            username='test_user',
            email='test@email.com',
            password='secret'
        )
        self.ad = Ad.objects.create(
            title='just a test',
            text='Ehy',
            owner=self.user
        )

    def test_ad_create_view(self):
        response = self.client.post(reverse('ads:ad_create'), {
            'title': 'New title',
            'text': 'New text',
            'owner': self.user.id,
        })
        self.assertEqual(response.status_code, 302)
        self.assertEqual(Ad.objects.last().title, 'New title')
        self.assertEqual(Ad.objects.last().text, 'New text')

Возможно, тест не справляется с созданием нового объявления, а затем сравнивает поля с первым объявлением в методе setUp. Я загружаю остальную часть кода, если это может помочь:

urls.py

from django.urls import path, reverse_lazy
from . import views


app_name='ads'

urlpatterns = [
    path('', views.AdListView.as_view(), name='all'),
    path('ad/<int:pk>', views.AdDetailView.as_view(), name='ad_detail'),
    path('ad/create',
        views.AdCreateView.as_view(success_url=reverse_lazy('ads:all')), name='ad_create'),
    ...
]

models.py

class Ad(models.Model) :
    title = models.CharField(
            max_length=200,
            validators=[MinLengthValidator(2, "Title must be greater than 2 characters")]
    )
    price = models.DecimalField(max_digits=7, decimal_places=2, null=True)
    text = models.TextField()
    """We use AUTH_USER_MODEL (which has a default value if it is not specified in settings.py) to create a Foreign Key relationship between the Ad model 
    and a django built-in User model"""
    owner = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
    comments = models.ManyToManyField(settings.AUTH_USER_MODEL, through='Comment', related_name='comments_owned')
    picture = models.BinaryField(null=True, editable=True)
    tags = TaggableManager(blank=True)
    content_type = models.CharField(max_length=256, null=True, help_text='The MIMEType of the file')
    favorites = models.ManyToManyField(settings.AUTH_USER_MODEL, through='Fav', related_name='favorite_ads')
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

views.py

class AdCreateView(LoginRequiredMixin, View):
    template_name = 'ads/ad_form.html'
    success_url = reverse_lazy('ads:all')

    def get(self, request, pk=None):
        form = CreateForm()
        ctx = {'form': form}
        return render(request, self.template_name, ctx)

    # Pull data
    def post(self, request, pk=None):
        form = CreateForm(request.POST, request.FILES or None)
        if not form.is_valid():
            ctx = {'form': form}
            return render(request, self.template_name, ctx)

        pic = form.save(commit=False)
        pic.owner = self.request.user
        pic.save()
        form.save_m2m()
        return redirect(self.success_url)

Надеюсь, это будет полезно, спасибо заранее!

Согласно Django Doc

Создать вид:

Представление, которое отображает форму для создания объекта, повторного отображения формы с ошибками валидации (если они есть) и сохранения объекта.

На основании моего опыта это не совсем верный способ создания View. Посмотрите документ Документ здесь.

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