Наиболее подходящий способ перенаправления страницы после успешного запроса POST в Django

У меня есть представление и форма в Django1.5. Если запрос POST выполнен успешно (на основе некоторых значений, которые я установил), мне нужно, чтобы страница перенаправлялась на другой URL-адрес, который создается одновременно.

В противном случае, если POST не был успешным, мне нужно оставаться на той же странице. Прямо сейчас я решил проблему следующим образом, но я совершенно уверен, что это не лучший способ сделать это:

Это часть моего взгляда:

def layer_create(request, template='layers/layer_create.html'):
    if request.method == 'GET':
       ....
    elif request.method == 'POST':
       out = {}
       ...
       new_table = 'something that comes from the form'
       if form.is_valid():
         ...
         try:
           ...
           out['success'] = True
         except:
           ...
           out['success'] = False
         finally:
           if out['success']:
            status_code = 200
             # THIS IS THE PART WHICH I THINK I CAN IMPROVE
            template = '/something/workspace:' + new_table + '/metadata' 

       else: # if form not valid
         out['success'] = False
        return render_to_response(template, RequestContext(request, {'form': form}))

Эта часть кода:

    template = '/something/workspace:' + new_table + '/metadata' 

мне кажется очень некрасивым. Но поскольку я новичок в Django, я не знаю, как подступиться к этому вопросу.


person user1919    schedule 14.06.2016    source источник


Ответы (2)


Первое примечание о Django 1.5 — вам настоятельно рекомендуется перейти на поддерживаемую версию, например 1.8.

перенаправление

Для перенаправления вы можете использовать ярлык перенаправление. (Или HttpResponseRedirect)

from django.shortcuts import redirect
# out of a view context
return redirect('/url/to/redirect/to/')

Создание URL-адресов

В самом деле, как вы уже упоминали, ваша попытка с template = '/something/workspace:' + new_table + '/metadata' не самая чистая :)

Django предоставляет действительно хороший способ с диспетчером URL.

Полное решение здесь зашло бы слишком далеко (или определенно потребовало бы более подробной информации о структуре вашего проекта) — я бы порекомендовал вам погрузиться в диспетчер URL-адресов Django.

Короче говоря, вы бы сделали что-то вроде:

# app/urls.py
urlpatterns = [
    #...
    url(r'^workspace/(?P<id>[0-9]+)/metadata/$', views.workspace_detail, name='workspace-detail-metadata'),
    #...
]

Затем вы можете изменить шаблоны URL:

from django.core.urlresolvers import reverse
url = reverse('workspace-detail-metadata', kwargs={'id': 123})
# would result in:
# .../workspace/123/metadata/
person ohrstrom    schedule 14.06.2016

В конце концов, я использовал метод «реверса» следующим образом:

layer = 'geonode:' + new_table
return HttpResponseRedirect(
   reverse(
       'layer_metadata',
        args=(
             layer,
         )))

Где мой файл urls.py включает:

url(r'^(?P<layername>[^/]*)/metadata$', 'layer_metadata', name="layer_metadata"),

Как описано здесь, это наиболее подходящий способ сделай это.

person user1919    schedule 15.06.2016