Angular в Django, передача нескольких параметров в вызове сервиса

У меня есть некоторый рабочий код на Django, где я создал простой загрузчик файлов с выбором даты, который передается через представление, а затем загружается в базу данных с помощью отдельного класса python, использующего sqlalchemy.

Однако я работаю над переносом аспекта пользовательского интерфейса на Angular Front End, но столкнулся с препятствием и не уверен, где я ошибаюсь. Пользователь должен иметь возможность загрузить двоичный файл excel, ввести дату и нажать кнопку загрузить. Это должно отправить запрос в представление, которое затем обрабатывает запрос. Представление само по себе работает отлично, когда файл и даты вводятся из HTML шаблона Django. Но я не могу заставить его работать, когда ввод осуществляется из Angular.

На данный момент я получаю сообщение об ошибке "Unsupported Media Type". Но я предполагаю, что я неправильно передаю службе файл и дату. Любая помощь была бы очень кстати

Вот мой код

views.py

@api_view(('POST',))
@csrf_exempt
def uploader(request):
    if request.method == 'POST':
        try:
            instance= uploader(request.FILES['data'], request.POST['selectedDate'])
            _ = upload_instance.run_upload_process('data')
            upload_message = "Success"
            return Response(upload_message, status=status.HTTP_201_CREATED)
        except Exception as e:
            upload_message = 'Error: ' + str(e)
            return Response(upload_message, status=status.HTTP_400_BAD_REQUEST)

file-upload.service.ts

DJANGO_SERVER: string = "http://127.0.0.1:8000";

  constructor(private http:HttpClient) { }
  public upload(data: any, selectedDate:any) {
    return this.http.post<any>(`${this.DJANGO_SERVER}/upload/`, data, selectedDate);
  }

upload.component.ts

onChange(event: any) {
    this.filetoUpload = event.target.files[0];
  }

  inputEvent(event:any) {
    this.monthEndDate = event.value;
  }

  onUpload() {
    this.loading = !this.loading;
    this.fileUploadService.upload(this.filetoUpload, this.monthEndDate).subscribe(
      (event: any) => {
        if (typeof (event) === 'object') {
          this.shortLink = event.link;
          this.loading = false;
        }
      }
    )
  }

upload.component.html

 <div class="input-group">
                <input class="form-control" type="file" (change)="onChange($event)">
                <!-- <span><button (click)="onUpload()" class="btn btn-dark">Upload</button></span> -->
            </div>
            <br>
            <div class="input-group" style="font-size: 18px">
                <mat-form-field appearance="outline">
                    <mat-label>Choose a Date</mat-label>
                    <input matInput [matDatepicker]="picker" (dateInput)="inputEvent($event)">
                    <mat-datepicker-toggle matSuffix [for]="picker"></mat-datepicker-toggle>
                    <mat-datepicker #picker></mat-datepicker>
                </mat-form-field>
            </div>

Ангулярный метод http post принимает три параметра

post(url, data, [config]);

Итак, вы можете изменить свой метод следующим образом

  DJANGO_SERVER: string = "http://127.0.0.1:8000";

  constructor(private http:HttpClient) { }
  public upload(data: any, selectedDate:any) {
    let postData : {
        data,
        selectedDate
    }
    return this.http.post<any>(`${this.DJANGO_SERVER}/upload/`, postData);
  } 

А на сервере Django выровняйте свой код для правильного доступа к телу поста.

Вернуться на верх