Как выполнить диспетчеризированный сигнал 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)
Вернуться на верх