Вариант использования довольно прост. Это менеджер фоновых транзакций, который требует, чтобы этот классовый c тип почтового обработчика:
class MyCreate(CreateView):
model = MyModel
fields = '__all__'
def post(self, request, *args, **kwargs):
self.form = self.get_form()
if self.form.is_valid():
self.object = self.form.save(commit=True)
return self.form_valid(self.form)
else:
return self.form_invalid(self.form)
не сохранял форму с form.save()
, а скорее сохранял объект формы где-нибудь (в сеанс?) запускает задачу Celery, которая затем будет отвечать за запуск form.save()
Проблема, с которой я сталкиваюсь, заключается в том, что объект формы вообще отказывается от сериализации, с JSON или pickle, это просто слишком богатый объект, и запуск задачи Celery требует сериализации аргументов. Я могу сериализовать только данные POST (request.POST)
, которые выполнимы, и передать их в задачу Celery в качестве аргумента, который работает, но я не могу найти способ восстановить экземпляр формы, не говоря уже о formset
.
если я хочу запустить задачу Celery из вида, на который я перенаправляю (скажем, реализует индикатор выполнения), тогда у меня возникает еще более сложная задача - передать форму совершенно новому Django представлению. Очевидный кандидат - сохранить его в сеансе:
self.request.session["my_form_data"] = self.request.POST
Но тогда в задаче Celery я даже не могу загрузить эти данные сеанса (возможно, я могу их обработать, используя вне сеансов просмотра *) 1016 *) или в представлении загрузки он передает его в качестве аргумента.
Цель, однако, заключается в том, чтобы у задачи Celery был объект Form, для которого мы можем вызвать метод save () из опубликованных данных и, как правило, управлять и манипулировать ими, как мы делаем Form. Одной из возможностей является создание экземпляра ModelForm с использованием данных POST в качестве исходных данных с последующим сохранением, но это не является очевидным решением и может работать, а может и не работать.
Короче говоря, я пытаюсь воссоздать небольшую часть контекста представления в задаче Celery, и учитывая, как часто я вижу, как Django и Celery упоминаются в Интернете вместе (и они, кажется, работают хорошо вместе) Мне действительно интересно, прежде чем я экспериментирую до смерти с помощью взломанного решения, если нет каких-то простых или канонических способов сделать это, чего мне не хватает.
Я вижу намеки на решения по всему место. Существует django -remote-forms , который обещает сериализовать форму, но не предлагает средств для воссоздания объекта или объектов Form (если мы, возможно, используем FormSets) из таких сериализованных данных. И есть намек на FormSerializer в Django REST framework , но это большая связка пакетов и обучение с большим количеством багажа, которое может даже не сделать то, что мне нужно к тому времени, когда я закончу.
Есть даже хорошая документация сериализации Django объектов , но не форм.
Было бы мечтой, если бы существовал простой канонический способ передачи Django Сформируйте объект в задачу Celery, чтобы он мог работать с ним так же, как это делает представление Django.