Django перенаправляет на предыдущие запросы на сохранение страницы

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

Кнопка удаления работает нормально, так как в нем удаляется информация в моей БД, но я бы хотел определить character_delete ( request ): if request . method == "GET" : Id = запрос . GET . get ( "idChar" ) char = Characterweapons . объектов . all (). filter ( characterid = Id ). delete () char2 = Персонажи . объекты , all (). filter ( characterid = Id ). delete () global cont return render ( request , 'users / characters_found_table.html' , cont ) на странице, где я показываю таблицу.

Проблема заключается в том, что для доступа к странице, отображающей таблицу, это делается путем поиска с помощью метода POST. Я думал о сохранении параметров, которые я сохраняю, когда выполняю поиск в глобальной переменной, а затем перенаправляю страницу таблицы снова, с сохраненными параметрами из первоначального поиска, это вроде как работает, но не так, как я хочу: он меняет мой URL-адрес, который перенаправляется после нажатия кнопки delete, и он не обновляет страницу вручную, поэтому я все еще вижу строку, которую я удалил. Если я обновляю ее вручную, я больше не вижу удаленную строку.

views.py:

render

Есть идеи?

Благодаря!

python,sql,django,database,

1

Ответов: 2


1 принят

Я предлагаю вам вместо этого использовать GET-запрос для отображения вашей таблицы. Удаление должно происходить через POST и использовать redirect(вместо render), чтобы снова обратиться к запросу GET.

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

Может быть, вот так:

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')

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


1

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

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

питон, SQL, Джанго, базы данных,
Похожие вопросы