2016-12-27 7 views
1

В настоящее время я использую представления классов для службы, которая использует внешние API, и сталкивается с проблемой с CreateView, которая не поддерживает исходные данные между GET (рендерингом формы) и POST (выгрузка данных) ,Django CreateView, поддерживающий данные между запросами

Этот вид/маршрут фактически получает данные из веб-службы, и пользователю требуется показать данные и загрузить файл. Запрос вебсервис заворачивают в fetch метод модели менеджера:

class OrderManager(models.Manager): 
    def fetch(self, user): 
     data = requests.get(...).json() 

     return dict(student=user, 
        foo=data['bar']) 

И для CreateView:

class OrderForm(ModelForm): 
    class Meta: 
     fields = ['picture'] 
     model = Order 

class OrderCreateView(LoginRequiredMixin, CreateView): 
    form_class = OrderForm 
    model = Order 

    def get_initial(self): 
     return self.model.objects.fetch(self.request.user) 

Он отлично работает, когда пользователь нажимает GET /order/new/ он правильно делает данные, получаемые из webservice и представляет форму загрузки файла. Но когда форма отправляется, она снова запускает get_initial(...) вместо сохранения данных из предыдущего запроса и снова обращается к веб-сервису.

Я хотел бы сохранить эти данные между запросами GET и POST, поэтому мне не нужно снова получать данные, как это возможно, с учетом классов и, желательно, без дополнительной работы? Я думал о кэшировании запросов, но на самом деле это не решает проблему, если пользователь просто слишком долго отправляет запрос.

ответ

1

Вы не должны ожидать, что состояние будет храниться в представлении на основе классов между запросами. Из Документации,

Каждый запрос, обслуживаемый классом, имеет независимое состояние; поэтому безопасно хранить переменные состояния на экземпляре (то есть self.foo = 3 - это поточно-безопасная операция).

Это очень просто неправильно понять: После того как форма была оказана, ваш контекст пошел и на следующий (POST) запросить ваш OrderCreateView будет экземпляр.

Непонятно, какова ваша причина в получении данных в диспетчере моделей? Как вы сохраняете эти данные?

В любом случае, поскольку похоже, что вы имеете дело с данными JSON, а размер файла не достаточно велик, чтобы гарантировать хранение файлов, я рекомендую вам использовать только Cache-Based Session.

Пример

Убедившись, что SessionMiddleware включена, добавьте в ваш метод get_initial.

class OrderCreateView(LoginRequiredMixin, CreateView): 
    form_class = OrderForm 
    model = Order 

    def get_initial(self): 
     # Inspect the user's session 
     user_data = self.request.session.get('user_data', None) 
     if user_data is None: 
      user_data = self.model.objects.fetch(self.request.user) 
      self.request.session['user_data'] = user_data 
     return user_data 


Я все еще не уверен, где вы сохраняете ваши данные, но если он находится в форме, вы можете получить доступ к данным сеанса в get_form_kwargs().

+0

Я не делал этот код для получения от менеджера, он уже был там и работал. В настоящее время страница работает, но с простым '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' ' – ranisalt

+0

@ranisalt, вы все равно не должны ожидать, что состояние будет храниться между запросами. Если вы дадите более подробную информацию, я могу привести более подробный пример ... но если вы почувствовали, что мой ответ помог, пожалуйста, отметьте как правильно. –

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

  • Нет связанных вопросов^_^