【问题标题】:How to redirect to a page after deleting in django?在django中删除后如何重定向到页面?
【发布时间】:2018-07-12 20:34:27
【问题描述】:

我试图在删除一个我不知道但它不起作用的对象后重定向到一个页面。该对象被删除但它没有重定向到任何页面有人可以帮助我吗? 如果您需要更多代码,可以问我。 谢谢 !

删除产品的浏览量

@login_required() 
def delete_product(request, product_id):
    delete = get_object_or_404(Product, pk=product_id)
    form = NewPro(instance=delete)
    if request.method == 'POST':
        form = NewPro(request.POST, request.FILES, instance=delete)
        if form.is_valid():
            delete.delete()

            return redirect('store_details')
        else:
            form = NewPro(instance=delete)
    return render(request, "default/product_delete.html", {'form': form, 'delete': delete})

网址格式

from django.urls import path
from . import views
from stores.urls import views

app_name = 'stores'

urlpatterns = [
    path('<int:store_id>/store_details/', views.store_details, name='store_details'),

]

 urlpatterns = [
    path('<int:product_id>/product', views.product, name='products_details'),
    path('add_products/', views.pro, name='add_products'),
    path('', views.index_products, name='index_products'),
    path('<int:product_id>/detail_product', views.detail_product, name='detail_product'),
    path('<int:product_id>/edit_product', views.edit_product, name='edit_product'),
    path('<int:product_id>/delete_product', views.delete_product, name='delete_product')

]

【问题讨论】:

  • 嗨,删除请求是ajax吗?
  • 不,这不是 Ajax
  • 嗯好的,删除请求后显示的页面是什么?
  • “store_details”的反向操作,未找到任何参数。尝试了 1 种模式:['stores\\/(?P[0-9]+)\\/store_details\\/$']
  • 这个urlpattern中没有store_details

标签: django django-forms django-templates django-views


【解决方案1】:

错误提示django无法解析视图store_details的路径。您可以使用django.urls 中的reverse 方法。

from django.urls import reverse

@login_required() 
def delete_product(request, product_id):
    delete = get_object_or_404(Product, pk=product_id)
    form = NewPro(instance=delete)
    if request.method == 'POST':
        # if this form is not valid we rander it again, so no need for else statement
        form = NewPro(request.POST, request.FILES, instance=delete)
        if form.is_valid():
            delete.delete()
            return redirect(reverse('stores:store_details'))
    # if it's not POST method render an empty form    
    else:
        form = NewPro()
    return render(request, "default/product_delete.html", {'form': form, 'delete': delete})

urls.py 的产品应用:

from django.urls import path
from . import views

app_name = 'product'

urlpatterns = [
    path('<int:product_id>/product', views.product, name='products_details'),
    path('add_products/', views.pro, name='add_products'),
    path('', views.index_products, name='index_products'),
    path('<int:product_id>/detail_product', views.detail_product, name='detail_product'),
    path('<int:product_id>/edit_product', views.edit_product, name='edit_product'),
    path('<int:product_id>/delete_product', views.delete_product, name='delete_product')
]

urls.py 的商店应用:

from django.urls import path
from . import views

app_name = 'stores'

urlpatterns = [
    path('<int:store_id>/store_details/', views.store_details, name='store_details'),
]    

包含的 URLconf 模块中的app_name 属性有助于 URL 的反向解析

我希望这会有所帮助。

【讨论】:

  • 嗯,我不明白这部分内容(将 YOUR_APP_NAME 的值替换为 urls.py 文件中的 app_name 的值。)
  • @SaifKhan,查看编辑。为清楚起见,发布您的urls.py
  • 我已经添加了产品的url。
【解决方案2】:

您没有为发布请求设置表单,请将else: 移回一个选项卡。

正确的语法:

@login_required() 
def delete_product(request, product_id):
    delete = get_object_or_404(Product, pk=product_id)
    form = NewPro(instance=delete)
    if request.method == 'POST':
        form = NewPro(request.POST, request.FILES, instance=delete)
        if form.is_valid():
            delete.delete()

            return redirect('store_details')
    else:
        form = NewPro(instance=delete)
    return render(request, "default/product_delete.html", {'form': form, 'delete': delete})

【讨论】:

  • “store_details”的反向操作,未找到任何参数。尝试了 1 种模式:['stores\\/(?P[0-9]+)\\/store_details\\/$']
  • 这是一个与我刚才说的无关的 URL 反向错误。 django 似乎找不到您要访问的 URL。
  • 是的,我没有遇到重定向问题的 else 部分的问题。
  • 你可以尝试导入from django.http import HttpResponseRedirect
  • 您也可以尝试使用 DELETE 方法而不是 POST 方法。
猜你喜欢
  • 2021-10-20
  • 1970-01-01
  • 2018-08-15
  • 2017-10-27
  • 1970-01-01
  • 2016-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多