Обработка формы Django в задании на сельдерее - Как задача сельдерея может увидеть форму? - PullRequest
2 голосов
/ 27 февраля 2020

Вариант использования довольно прост. Это менеджер фоновых транзакций, который требует, чтобы этот классовый 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...