2016-07-12 2 views
1

Я генерирую объект из представленной формы. Я хочу передать сформированный AutoField в следующую форму как скрытый элемент формы. Однако я не могу понять, как передать переменную от post() до get_context_data(). Я знаю, что сначала вызывается post(), а затем get_context_data(), но добавление переменной в self не дает ожидаемых результатов (атрибут не существует на self).Передача данных из post() в get_context_data()

Вот пример того, что я испытываю:

def get_context_data(self, **kwargs): 
    context = super(MyView, self).get_context_data(**kwargs) 
    print self.hello 
    return context 

def post(self, request, *args, **kwargs): 
    self.hello = "hello" 
    return HttpResponseRedirect(request.path) 

self.hello не действует при вызове в get_context_data. Мне кажется, что я ошибаюсь в вызове HttpResponseRedirect(request.path), но я не уверен, как еще визуализировать шаблон.

Является ли это простой ошибкой, или я должен приближаться к этому совершенно по-другому?

+0

'get_context_data()' выполняется только для запросов 'GET' (при условии, что вы используете' FormView'), а не для 'POST'-запросов, обрабатываемых' post() '. 'get_context_data()' используется для получения контекста шаблона, который является избыточным, если вы просто перенаправляете в любом случае. Можете ли вы объяснить, что именно вы пытаетесь достичь? – solarissmoke

+0

Я создаю один объект из нескольких форм. Form1 отправляется на страницу Form2. Я создаю половину объекта в 'post()' Form2 и хотел бы иметь возможность отправить Form2 на целевую страницу, где объект завершен. Мне нужно знать, какой объект создается, поэтому я подумал, что захвачу «AutoField», сгенерированный в первом post(), и передать его как скрытое поле в Form2, чтобы обновление на целевой странице post() 'получит доступ к правильному объекту. Я уверен, что есть лучший способ, и я открыт для предложений. (Кроме FormWizard. Это альтернатива этому по причинам ...) – Tyler

+0

Вы можете использовать сеансы для хранения этих данных между представлениями? – solarissmoke

ответ

1

Вы должны найти способ передать идентификатор объекта на следующую страницу. Варианты, которые приходят на ум, - это поместить его в URL-адрес или как solarissmoke предложил сохранить его в сеансе. Если вы делаете это в URL-адресе, вы также можете поставить последовательность страниц (значение 1 для форсте-формы, 2 для второго ...).

Приятная вещь в этом подходе состоит в том, что вы можете охватить все functonailty в одном представлении: в зависимости от страницы задаются соответствующие поля в методах get_object (self.fields = [....]) и имена шаблонов в методе get_template_names.

Так, используя Updateview, это будет выглядеть следующим образом:

urls.py:

.... 
url(r'^mysite/(?P<object_no>\d+)/(?P<form_no>\d+)$', BaseView.as_view()), 

views.py:

class BaseView(UpdateView): 
    def get_object(self):  
     obj=MyModel.objects.get(id=self.kwargs['object_no']) 
     form_no = self.kwargs['form_no'] 
     if form_no=="1": 
      self_fields=["field1","field2"...] 
     ..... 
    def get_object(self):  
     obj=MyModel.objects.get(id=self.kwargs['object_no']) 
     form_no = self.kwargs['form_no'] 
     if form_no=="1": 
      self_fields=["field1","field2"...] 
     .....    
     return obj 
    def get_template_names(self): 
     from_no = self.kwargs['form_no'] 
     if form_no=="1": 
      return ["template1.html"] 
     .... 

Вы должны убедиться, что все поля может быть нулевым.

+0

Это оказалось совершенным. Благодарю. – Tyler

2

С помощью определения post вы поменяли поведение по умолчанию, отображаемое по умолчанию. Вы можете видеть, что нет никакого вызова get_context_data или любого другого метода класса, поэтому, естественно, они не будут вызваны.

Как правило, вы не должны переопределять конкретные методы получения или публикации. Вы не показали полного представления, поэтому неясно, какое поведение вы пытаетесь достичь, но, например, в виде формы вы хотели бы определить success_url, чтобы указать место, в которое будет перенаправлена ​​форма после представления.

Смежные вопросы