Подтверждение общего успеха FormView POST обратно пользователю с данными POST - PullRequest
3 голосов
/ 14 февраля 2012

Используя общий FormView, я хотел бы отразить кое-что о данных POST, которые были отправлены обратно пользователю, но я не уверен, как лучше это сделать.

class MyView(generic.FormView):
    form_class = MyForm
    def get_success_url(self):
        return reverse('success')

reverse('success') перенаправляет на простой

class SuccessView(generic.TemplateView):
    template_name = 'success.html'

Есть ли способ, которым я могу получить доступ к params объекту в SuccessView через вызов get_success_url, или есть лучший (и более простой) способ сделать это? ТИА Дан

ОБНОВЛЕНИЕ (мое решение, но спасибо за идеи)

Я действительно обнаружил, что это был самый простой способ (для меня) решить проблему:

class SuccessMixin(object):
    def post(self, request, *args, **kwargs):
        form_class = self.get_form_class()
        form = self.get_form(form_class)

        if form.is_valid():
            return self.form_valid(form)
        else:
            return self.form_invalid(form, **kwargs)

    def form_valid(self, form):
        # this is my post processing step which returns the
        # feedback data that I want to pass to the user
        form_data = form.get_some_data_from_form()
        return render_to_response('submitted.html', 
            {'form_data': form_data,}, 
            context_instance=RequestContext(self.request))

Каждое представление наследует этот миксин, и если форма действительна, я извлекаю из нее данные обратной связи и отображаю их как ответ - полностью обходя перенаправление get_success_url. Я удалил get_success_url и SuccessView.

Ответы [ 3 ]

5 голосов
/ 14 февраля 2012

Включите данные в качестве GET параметров в ваш URL успеха.

def get_success_url(self):
   url = reverse('success')
   # maybe use urlencode for more complicated parameters
   return "%s?foo=%s" % (url, self.request.POST['bar'])

Затем в вашем шаблоне получите доступ к параметрам в данных GET.

foo: {{ request.GET.foo }}
2 голосов
/ 08 января 2015

Я тоже пытался понять это, и простое решение - использовать:

from django.contrib import messages

В get_success_url (self) вы можете написать

def get_success_url(self)
    messages.add_message(self.request, messages.SUCCESS, 'Contact Successfully Updated!')
    return reverse('contacts:contact_detail', args=(self.get_object().id,))

И в своем шаблонеможете получить доступ к этому сообщению через

{% for message in messages %}
    {{ message }}
{% endfor %}
1 голос
/ 14 февраля 2012

Одним из способов достижения того, что вы хотите сделать, было бы использование сессий.Сохраните все необходимые значения в объекте сеанса пользователя и получите к ним доступ из SuccessView.Обратитесь к документации Django для получения более подробной информации.

...