Как перенаправить на успех после метода POST в Django 2

Я хотел бы знать, как можно обрабатывать запросы GET ИЛИ POST из класса FormView, чтобы отобразить несвязанную форму для GET и отправить форму в базу данных для POST, а затем перенаправить на страницу успеха (информационное сообщение).

Какой шаблон использовать для методов GET и POST и как включить сообщение после перенаправления на URL-адрес успеха?

просмотров.py:

from django.shortcuts import render,redirect,render_to_response,get_object_or_404
from django.forms import ModelForm
from django.views import View

from django.views.generic.edit import CreateView
from .forms import MyPlaceForm
from .models import Place
from django.urls.base import reverse_lazy


from django.contrib import messages


#Ceate your class-based views here.
class MapView(View):
    def get(self, request):
        'Display map'
        return render(request,template_name='index.html')

# Handling forms with class-based view
class PlaceFormView(View):
    form_class = MyPlaceForm
    initial = {'key': 'value'}
    template_name = 'name.html'

    # Provide Blank Form if GET request
    def get(self, request, *args, **kwargs):
        form = self.form_class(initial=self.initial)
        return render(request, self.template_name, {'form': form})

# Provide a message if POST request
    def post(self, request, *args, **kwargs):
        form = self.form_class(request.POST)
        success_url=reverse_lazy('success')
        if form.is_valid():
            # <process form cleaned data>

            messages.add_message(request, messages.INFO, 'Hello world.')
            return reverse_lazy(success_url)

        return render(request, self.template_name, {'form': form})

URL.py:

from django.contrib import admin
from django.http import HttpResponse
from django.urls import path
from addismap.views import MapView,PlaceFormView


urlpatterns=[
    path('map/',MapView.as_view()),
    path('place/', PlaceFormView.as_view(), name='post-place'),
    path('place/success/',PlaceFormView.as_view(), name='success')

    ]

person Kaleab Woldemariam    schedule 20.07.2018    source источник
comment
Вы не используете FormView. Если бы вы были, весь этот код был бы сделан для вас.   -  person Daniel Roseman    schedule 20.07.2018
comment
Дэниел Роузман Можете ли вы предложить правку?   -  person Kaleab Woldemariam    schedule 20.07.2018
comment
Наследуйтесь от FormView, удалите методы get и post.   -  person Daniel Roseman    schedule 20.07.2018


Ответы (1)


Следуя документации, вы можете сделать что-то вроде этого:

# views.py    
if request.method == "POST":

    if form.is_valid():

        # <process form cleaned data>
        messages.success(request, 'Form updated with success.')
        return redirect('/success-page')

    else:       
        messages.error(request, 'Ops! Something went wrong')
        return redirect('/error-page')

На странице шаблона вы можете получить сообщение, используя код цикла for:

{% if messages %}
{% for message in messages %}
<div {% if message.tags %} class="alert alert-{{ message.tags }} alert-dismissible fade show" {% endif %}>
    <span>{{ message }}</span>
</div>
{% endfor %}
{% endif %}

Edit1: убедитесь, что вы импортировали тег сообщения и перенаправили его в файл views.py.

from django.contrib import messages
from django.shortcuts import render, redirect
person euduzz    schedule 20.07.2018
comment
Спасибо, но я получаю No Success_url для перенаправления на ошибку, хотя я указал «регистрацию» как Success_url. - person Kaleab Woldemariam; 20.07.2018
comment
Вам не нужна конкретно страница успеха, вы можете перенаправить обратно на ту же страницу вашей формы, передав сообщение об успехе - person euduzz; 20.07.2018