【问题标题】:Django Redirecting to a created view (pk)Django重定向到创建的视图(pk)
【发布时间】:2020-11-24 11:37:53
【问题描述】:

我在填写表格后尝试重定向到已创建的帖子。我尝试关注Django redirect to created post after form,但遇到了这个错误

TypeError at /inquiry/
inquiry() missing 1 required positional argument: 'pk'
def inquiry(request,pk):

    form = RescueeForm()

    if request.method == 'POST':
        form = RescueeForm(request.POST)
        if form.is_valid():
            form.save()
        return redirect ('rescuee', form.pk)

    context = {
        'form' : form
    }

    return render(request, "inquiry_page.html", context)

urls.py

urlpatterns = [
    path('', views.index, name='index'),
    path('inquiry/', views.inquiry, name='inquiry'),
    path('rescuee/<int:pk>', views.rescueeview, name='rescuee'),
]

编辑:添加逗号

【问题讨论】:

    标签: python django redirect django-views


    【解决方案1】:

    在您发布的 sn-p 中,对 redirect 的调用中似乎缺少逗号。此外,正如其他人所指出的,您将 pk 参数传递给您不使用的 inquiry,这会导致错误。解决此问题后,您指出form.pk 存在属性错误,这仅意味着form 没有名为pk 的属性。也许你的意思是form.id

    试试

    def inquiry(request):
    
        form = RescueeForm()
    
        if request.method == 'POST':
            form = RescueeForm(request.POST)
            if form.is_valid():
                form.save()
            return redirect('rescuee', form.id)
    
        context = {
            'form' : form
        }
    
        return render(request, "inquiry_page.html", context)
    

    或者,如果您需要表单创建的模型的pk,您可以尝试:

    def inquiry(request):
    
        form = RescueeForm()
    
        if request.method == 'POST':
            form = RescueeForm(request.POST)
            if form.is_valid():
                rescuee_instance = form.save()
            return redirect('rescuee', rescuee_instance.pk)
    
        context = {
            'form' : form
        }
    
        return render(request, "inquiry_page.html", context)
    

    【讨论】:

    • 我已经尝试了替代解决方案,它奏效了!谢谢!
    【解决方案2】:

    我看到你忘记了rescueeform.pk 之间的,return redirect ('rescuee', form.pk)

    您的inquiry 视图接受pk 参数。 在您的urls.py 中,您的查询路径不采用 pk 参数。 像这样更改您的urls.py

     urlpatterns = [
        path('', views.index, name='index'),
        path('inquiry/<int:pk>', views.inquiry, name='inquiry'), # Inquiry view takes 'pk' argument
        path('rescuee/<int:pk>', views.rescueeview, name='rescuee'),
    ]
    

    【讨论】:

    • 我已经尝试过了,遇到了我的 index html 问题Reverse for 'inquiry' with no arguments not found. 1 pattern(s) tried: ['inquiry/(?P&lt;pk&gt;[0-9]+)$']。于是我尝试直接去索引/查询却遇到了这个AttributeError at /inquiry/'RescueeForm' object has no attribute 'pk'
    • @Romeo 将form.pk 更改为form.id,就像@AlonzoCathedral 说的那样。如果可行,请接受他的回答,但请支持我的回答:)。
    【解决方案3】:

    为什么你在查询视图中使用 pk,而你的 url 不接受 pk 的任何值。

    我认为这是解决方案,因为您没有在视图代码中使用 pk。试试看:

    def inquiry(request):
        form = RescueeForm()
        #other codes
    

    注意:收到您的回复后,我假设有问题 表单验证。我会建议你试试这个代码:

    # views.py
    def inquiry(request):
    
        form = RescueeForm()
    
        if request.method == 'POST':
            form = RescueeForm(request.POST)
            if form.is_valid():
                form.save()
                return redirect ('rescuee', form.pk)
            else:
                print("validation error!")
    
        context = {
            'form' : form
        }
    
        return render(request, "inquiry_page.html", context)
    

    【讨论】:

    • 其实这个我也试过,但是遇到了AttributeError at /inquiry/'RescueeForm' object has no attribute 'pk'
    • @Romeo 可能是表单验证有问题。尝试在“if form.is_valid():”函数中使用“return redirect ('rescuee', form.pk)”。
    猜你喜欢
    • 2019-10-21
    • 1970-01-01
    • 2018-10-21
    • 2020-08-23
    • 2015-11-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-15
    • 2021-06-16
    相关资源
    最近更新 更多