【问题标题】:Django redirect to previous page saving queriesDjango 重定向到上一页保存查询
【发布时间】:2019-01-31 15:48:41
【问题描述】:

所以我有一个显示表格的页面,并且在每一行上我都有一个名为 delete 的按钮,用于删除该行以及我的数据库中与之相关的所有信息。

删除按钮工作正常,因为它删除了我的数据库中的信息,但我想将它重定向到我显示表格的页面。

问题在于,要访问显示表格的页面,它是通过使用 POST 方法进行搜索来完成的。我想保存在全局变量中进行搜索时保​​存的参数,然后再次渲染表格页面,使用初始搜索中保存的参数,它有点工作,但不是我想要的方式:它改变了我的单击删除后重定向的 URL,并且它不会手动更新页面,所以我仍然看到我删除的行,如果我手动刷新它,我再也看不到删除的行了。

views.py:

def character_delete (request):
    if request.method == "GET":
        Id = request.GET.get("idChar")
        char = Characterweapons.objects.all().filter(characterid=Id).delete()
        char2 = Characters.objects.all().filter(characterid=Id).delete()

    global cont

    return render(request, 'users/characters_found_table.html',cont)

有什么想法吗?

谢谢!

【问题讨论】:

  • 为什么要显示带有 POST 请求的表格?你可以使用标准的 GET 代替吗?这样会容易很多。
  • 是的,我能做到!我只是为了有一个更干净的网址
  • 无关:xxx.objects.all().filter(...) 可以缩短为xxx.objects.filter(...)

标签: python sql django database


【解决方案1】:

我建议您使用 GET 请求来显示您的表格。删除应通过 POST 进行,并使用 redirect(而不是 render)再次转到 GET 请求。

如果您想在请求之间存储过滤器参数,我建议您使用Django Session 来存储该信息。

可能是这样的:

urls.py

url(r'^characters$',
    views.show_characters,
    name='show-characters'),
url(r'^characters/(?P<char_pk>[0-9]+)/delete/$',
    views.delete_character,
    name='delete-character'),

views.py

def show_characters(request):
    # this will be a standard GET request to display the table

    filter_param_1 = request.GET.get('filter_param_1', None)
    if filter_param_1 is None:
        # if there is no GET param, look in the session
        filter_param_1 = request.session.get('filter_param_1', None)
    else:
        # if there is a GET param, store it in the session for the next time
        request.session['filter_param_1'] = filter_param_1

    ctx = {
        'data': Characters.objects.filter(some_field=filter_param_1),
    }
    return render(request, 'users/characters_found_table.html', ctx)

def delete_character(request, char_pk):
    if request.method == "POST":
        character = get_obect_or_404(Characters, pk=char_pk)
        # here you can delete other related objects, if they're not set up for delete CASCADE
        character.delete()
        messages.success(request, 'delete was successful')

    return redirect('show-characters')

这对你有用吗?

【讨论】:

  • 我无法重定向到“show-characters”,因为最初加载需要搜索参数:(
  • @ArnauEspin 您可以将搜索参数存储在会话中。我编辑了我的答案以包括一种方法来做到这一点。这行得通吗?
  • 另外,messages.success 不起作用,我想我需要导入它?
【解决方案2】:

任何状态更改操作(如删除)都应该作为 POST 发生,而任何读取操作都应该作为 GET 发生。此外,您需要在任何成功的 POST 之后进行重定向,这样如果用户按下后退按钮,则不会再次执行该帖子。

比如:

urls.py

...
(r'^characters/delete/$', views.delete_character),
(r'^characters/$', views.list_characters),

和views.py

def list_characters(request):
    query_params = request.GET.get('q', '')
    ctx = template.Context({
        ...,
        query_params=urllib.quote(query_params)  # <=== pass the query params to the template
    })
    return render(request, 'users/characters_found_table.html', ctx)

在模板中,像这样生成删除链接:

<form action="delete/" method=POST>
    <input type=hidden name=q value="{{ query_params }}">
    <input type=hidden name=idChar value="{{ ... }}">
    <button type=submit>delete</button>
</form>

那么删除视图可以写成

def delete_character(request):
    chracter_id = request.POST['idChar']  # fail hard if not provided
    q = request.POST['q']
    Characterweapons.objects.filter(characterid=chracter_id ).delete()
    Characters.objects.filter(characterid=chracter_id ).delete()        
    return http.HttpResponseRedirect('../?q=' + q)  # return to the list url (with search params)

这样您就不需要保存任何全局状态。

【讨论】:

    猜你喜欢
    • 2021-07-23
    • 2011-09-24
    • 1970-01-01
    • 2018-09-09
    • 2023-04-08
    • 2010-10-22
    • 2020-12-08
    • 1970-01-01
    相关资源
    最近更新 更多