Мне нужно вернуть форму из задачи django из сельдерея. Моя задача вызывается из следующего представления django:
class MyView(CreateView):
model = MyModel
form_class = MyForm
success_url = '/create/form'
def form_valid(self, form):
form.save()
# I call my task in here
period.delay()
print("Loading task...")
return super(MyView, self).form_valid(form)
Имя моей задачи: "period" . Оно сравнивает даты с целью открыть событие, пока выполняется условие по моему ЕСЛИ верно. Мой «событие» - это формула, которую пользователь должен подтвердить присутствие.
Моя задача:
from .views import MyAnotherView
# others imports...
"""
in my settings.py, I had to call tha task every minute:
CELERYBEAT_SCHEDULE = {
'add-periodic-events': {
'task': 'myapp.tasks.period',
'schedule': crontab(minute='*'),
}
}
"""
@shared_task(serializer='json')
def period():
event = MyModel.objects.get(id=1) # I limited my model to receive only one object
request = RequestFactory.get('/another/form')
view = MyAnotherView()
week_d = week_day(event.day) # day is a field of my model
event_d = event_day(week_d, event.hour) # hour is a field of my model
conf_d = presence_confirm(event.before_days, event.begin_hour, event_d) # before_days and begin_hour are fields of my model
utc_now = pytz.utc.localize(datetime.utcnow())
n = utc_now.astimezone(pytz.timezone('America/Recife'))
t_str = '{}-{}-{}'.format(n.year, n.month, n.day)
t_hour = ' {}:{}'.format(n.hour, n.minute)
today = t_str + t_hour
today = datetime.strptime(today, '%Y-%m-%d %H:%M')
if (today >= conf_d) and (today < event_d):
# HOW TO CALL MY FORMULARY???
print("Call my formulary")
view.setup(request)
else:
# another thing
Формуляр, который я хочу показать после вызова моей задачи и в то время как условие истинно. Оно придет из следующих моделей django:
class MyAnotherModel(models.Model):
OPTIONS = (
(True, 'Sim'),
(False, 'Não'),
)
player = models.OneToOneField(MyUserModel, primary_key=True, on_delete=models.CASCADE)
confirm = models.BooleanField(choices=OPTIONS, default=False)
modified = models.DateTimeField(auto_now_add=True)
Короче говоря, я хочу, чтобы мой формуляр появлялся, пока мое условие истинно. Поэтому я попытался использовать в своей задаче RequestFactory.get, чтобы перехватить URL и вызвать представление (MyAnotherView).
# ...
request = RequestFactory.get('/another/form')
view = MyAnotherView() # View responsável em instanciar MyAnotherModel
# ...
if (today >= conf_d) and (today < event_d):
view.setup(request)
Однако я получил ImportError: невозможно импортировать имя 'MyAnotherView' . Если кто-нибудь может мне помочь, я приветствую!