Можно ли в Django указывать отдельные глаголы `http` с одинаковым urlpattern? - PullRequest
0 голосов
/ 09 сентября 2018

Я создаю регистрационную форму в Django 2.1. В типичных примерах люди используют один и тот же метод представлений как для отображения форм, так и для приема POST запросов из форм, подобных следующим:

В urls.py:

urlpatterns = [
    path('auth/register', auth.register, name='register')
]

и в представлении с именем auth.py:

from django.shortcuts import render
from blog_admin.forms import SignUpForm
from django.contrib.auth.forms import UserCreationForm


def register(request):
    if request.method == 'POST':
        form = UserCreationForm(request.POST)
        if form.is_valid():
            # do registration stuff...
    else:
        form = SignUpForm()

        return render(request, 'blog_admin/auth/register.html', {'form': form})

но я хочу использовать отдельный метод для отображения формы и обработки процесса регистрации, а также хочу использовать идентичный urlpatterns один с GET и один с POST функциональностью, например:

в urls.py

    urlpatterns = [
        # can we limit it range, so that it only works for GET request
        path('auth/register', auth.show_registration_form, name='register_show'),
        # can we limit it range, so that it only works for POST request
        path('auth/register', auth.register, name='register')
    ]

и в представлении с именем auth.py:

from django.shortcuts import render
from blog_admin.forms import SignUpForm
from django.contrib.auth.forms import UserCreationForm


def show_registration_form(request):
    form = SignUpForm()

    return render(request, 'blog_admin/auth/register.html', {'form': form})

def register(request):
    # do registration stuff...

Если понадобится еще пример из других фреймворков, в php Laravel это было бы сделано следующим образом:

Route::get('auth/register', ['as' => 'register_show', 'uses' => 'Auth\AuthController@show_registration_form']);
Route::post('auth/register', ['as' => 'register', 'uses' => 'Auth\AuthController@register']);
...