Представление для тестирования Django с помощью pytest

Не могли бы вы помочь мне отладить этот тест? Я получил эту ошибку (я не знаю почему, так как у меня у меня нет пк в просмотре): django.contrib.auth.models.User.DoesNotExist: User matching query does not exist. Я думаю, что ошибка связана с pk=request.user.id, переданным в качестве аргумента в User objects в view function.

class TestViews(TestCase):

    def setUp(self):
         self.client = Client()
         self.create_campaign_naming_tool_url = reverse('create_campaign_naming_tool')
         self.user = User.objects.create_user(
            username = 'admin',
            email = 'admin@sigma.fr',
            password = '1234'
         )

    def test_create_campaign_naming_tool(self):
        response = self.client.get(self.create_campaign_naming_tool_url)
        self.assertEqual(response.status_code, 200)
        self.assertTemplateUsed(response, 'form.html')

Вот мое мнение

def create_campaign_naming_tool(request):
    current_user = User.objects.get(pk=request.user.id)
    form = CampaignNamingToolForm(initial={'user': current_user})
    context = {
        'form': form,
    }
    if request.method == 'POST':
        campaign = CampaignNamingTool(user=current_user)
        form = CampaignNamingToolForm(request.POST, instance=campaign)

        if form.is_valid():
            form.save()
            messages.success(request, "Your campaign haven ben\
                            success fully created.")
            return render(request, 'form.html', context)

    return render(request, 'form.html', context)

Вы не выполнили вход пользователя в тест:

class TestViews(TestCase):

    def setUp(self):
        self.client = Client()
        self.create_campaign_naming_tool_url = reverse('create_campaign_naming_tool')
        self.user = User.objects.create_user(
            username = 'admin',
            email = 'admin@sigma.fr',
            password = '1234'
        )
        self.client.login(username='admin', password='1234')

    # …

Также не имеет смысла делать такой запрос для получения пользователя: request.user является объектом User, поэтому вы можете работать непосредственно с ним:

from django.contrib.auth.decorators import login_required
from django.shortcuts import redirect

@login_required
def create_campaign_naming_tool(request):
    form = CampaignNamingToolForm(initial={'user': request.user})
    if request.method == 'POST':
        campaign = CampaignNamingTool(user=request.user)
        form = CampaignNamingToolForm(request.POST, instance=campaign)
        if form.is_valid():
            form.save()
            messages.success(request, 'Your campaign has been successfully created.')
            return redirect('name-of-some-view')

    context = {
        'form': form,
    }
    return render(request, 'form.html', context)

Note: You can limit views to a view to authenticated users with the @login_required decorator [Django-doc].


Note: In case of a successful POST request, you should make a redirect [Django-doc] to implement the Post/Redirect/Get pattern [wiki]. This avoids that you make the same POST request when the user refreshes the browser.

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