Django: «Неправильно настроен на» после формы POST с использованием CreateView - PullRequest
0 голосов
/ 04 июня 2019

Я хочу добавить данные в свою базу данных из формы (которая представляет собой CreateView).К сожалению, после публикации я получил

'Неправильно настроен на / лиц / новый /'

Я пытался отредактировать мой urls.py , но яКажется, я что-то пропустил.

Мой views.py

class PersonListView(ListView):
    model = Person
    template_name = 'app/home.html'
    context_object_name = 'users'

class PersonCreateView(CreateView):
    model = Person
    fields = ['name','surname']

Мой urls.py в проекте

*imports*
urlpatterns = [
    path('admin/',admin.site.urls),
    path('persons/', include('app.urls')),
]

My urls.py в приложении

*imports*
urlpatterns = [
    path('',PersonListView.as_view(),name='persons),
    path('new/',PersonCreateView.as_view(),name='person-create),
]

После отправки моей формы данные добавляются в базу данных, но я получил ошибку, как указано выше.

1 Ответ

1 голос
/ 04 июня 2019

Краткий ответ : вам необходимо указать атрибут success_url [Django-doc] или переопределить form_valid [Джанго-док] .

В CreateView [Джанго-док] (большинство просмотров с FormMixin [Джанго-док] ), вам нужно указать, что должно произойти, когда форма была успешно обработана.

По умолчанию a ModelFormMixin [Django-doc] будет первым сохранить объект [GitHub] :

def form_valid(self, form):
    """If the form is valid, save the associated model."""
    self.object = form.save()
    return <b>super().form_valid(form)</b>

, а затем базовый FormMixin будет перенаправлять на success_url [GitHub] :

def form_valid(self, form):
    """If the form is valid, redirect to the supplied URL."""
    return HttpResponseRedirect(<b>self.get_success_url()</b>)

get_success_url извлечет атрибут success_url [GitHub] и вызовет ошибку ImproperlyConfigured, если она отсутствует:

def get_success_url(self):
    """Return the URL to redirect to after processing a valid form."""
    if not self.success_url:
        raise ImproperlyConfigured("No URL to redirect to. Provide a success_url.")
    return <b>str(self.success_url)</b>  # success_url may be lazy

Таким образом, вы можете указать success_url, например, с помощью reverse_lazy [Django-doc] :

from django.urls import <b>reverse_lazy</b>

class PersonCreateView(CreateView):
    model = Person
    fields = ['name','surname']
    <b>success_url = reverse_lazy('persons')</b>

Здесь persons - это имя из path(..), на которое мы перенаправляем. Перенаправление, как правило, является предпочтительным способом обработки успешной формы: он является частью Post / Redirect / Get архитектурного шаблона [wiki] . Если вы отобразите страницу для запроса POST, то пользователь, который обновит страницу в браузере, повторно отправит те же данные на сервер и, таким образом, может создать секунду . объект.

Другой вариант - переопределить form_valid и сделать что-то еще после вызова super().form_valid(form) (так как это сохранит объект в базе данных).

...