Как выполнить диспетчеризированный сигнал Django в функции представления?
Инфо: Я хочу сделать приложение, которое будет загружать файл перед отправкой формы. TusUpload будет получать данные файла и посылать сигнал. если пользователь добавит несколько файлов, он будет посылать сигнал несколько раз.
Я хочу выполнить этот сигнал в create_page
модели Пример кода приведен ниже. Функция create_page
принимает файлы, сигналы которых посылаются TusUpload
и сохраняются в объекте Attach
модели post
также связанного объекта.
create_page
- это просто логика, которую я хочу выполнить.
Надеюсь, вы сможете предоставить информацию.
views.py
class TusUpload(View):
def patch(self, request, resource_id, *args, **kwargs):
tus_file = TusFile.get_tusfile_or_404(str(resource_id))
chunk = TusChunk(request)
if tus_file.is_complete():
# file transfer complete, rename from resource id to actual filename
self.send_signal(tus_file)
return TusResponse(status=204, extra_headers={'Upload-Offset': tus_file.offset})
def send_signal(self, tus_file):
tus_upload_finished_signal.send(
sender=self.__class__,
metadata=tus_file.metadata,
file_id=tus_file.resource_id,
filename=tus_file.filename,
upload_file_path=tus_file.get_path(),
file_size=tus_file.file_size,
upload_url=settings.TUS_UPLOAD_URL,
destination_folder=settings.TUS_DESTINATION_DIR)
signals.py
tus_upload_finished_signal = django.dispatch.Signal(
providing_args=[
"metadata",
"file_id",
"filename",
"upload_file_path",
"file_size",
"upload_url",
"destination_folder"
]
)
views.py
def create_page(request):
files = []
@receiver(tus_upload_finished_signal)
def create_file(sender, **kwargs):
filename = kwargs['filename']
files.append(filename)
if request.method == 'POST':
form = PostForm(request.POST or None, request.FILES)
if form.is_valid():
form.save(commit=False)
form.instance.author = request.user
form.save()
for f in files:
attach = Attach()
attach.file = f
attach.post=form.instance
attach.save()
return redirect('index_page')
else:
form = PostForm()
context = {
'form': form,
}
return render(request, 'core/_form.html', context)