django测试视图与pytest

发布于 2025-02-02 12:35:40 字数 1597 浏览 0 评论 0原文

您能帮我调试这项测试吗?我有这个错误(因为我不知道,所以我 没有pk的视图):django.contrib.auth.models.user.doesnotexist:不存在用户匹配查询。我认为该错误是pk = pk = request.user.id.user.id用户对象中以参数为视图函数中传递。

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 = '[email protected]',
            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)

Could you please helpe me debugging this test? I got this error (I don't know whay since, I
have no pk in view): django.contrib.auth.models.User.DoesNotExist: User matching query does not exist.I think the error is due to pk=request.user.id passed as argument in User objects in the 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 = '[email protected]',
            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')

Here is my view

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)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

以可爱出名 2025-02-09 12:35:40

您没有在测试中登录用户:

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 = '[email protected]',
            password = '1234'
        )
        self.client.login(username='admin', password='1234')

    # …

进行此类查询以获取用户也没有意义:request.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)

注意:您可以将视图限制在视图中
/code> 装饰器  [django-doc]


注意:如果成功发布请求,则应制作 redirect
[Django-doc]

实现 [Wiki]
这避免了您在用户刷新用户时提出相同的帖子请求
浏览器。


You did not login the user in the test:

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 = '[email protected]',
            password = '1234'
        )
        self.client.login(username='admin', password='1234')

    # …

It also makes no sense to do such query to fetch the user: request.user is a User object, so you can work directly with this:

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.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文