Джанго перенаправить на предыдущую страницу сохранения запросов - PullRequest
0 голосов
/ 25 августа 2018

Итак, у меня есть страница, на которой отображается таблица, и в каждой строке у меня есть кнопка удаления, которая удаляет эту строку и всю связанную с ней информацию в моей базе данных.

Кнопка удаления работает нормально, так какв нем удаляется информация из моей БД, но я бы хотел перенаправить ее на страницу, где я отображаю таблицу.

Проблема в том, что для доступа к странице, которая показывает таблицу, это делается черезпоиск методом 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)

Есть идеи?

Спасибо!

Ответы [ 2 ]

0 голосов
/ 25 августа 2018

Я предлагаю вам использовать запрос 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')

Это работает для вас?

0 голосов
/ 25 августа 2018

Любая операция изменения состояния (например, удаление) должна выполняться как 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)

Таким образом, вам не нужно сохранять глобальное состояние.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...