Подключите интерфейс Angular к представлению Django

#python #django #angular

#python #django #angular

Вопрос:

У меня есть базовое приложение django, которое просто загружает файл Excel в базу данных oracle. Я создал класс python (uploader) для выполнения некоторых проверок работоспособности файла и загрузки в базу данных.

Мне удалось успешно создать пользовательский интерфейс с использованием HTML в шаблонах Django, который отлично работает.

Тем не менее, я хотел перенести интерфейс на интерфейс Angular.

Я создал приложение angular, но в настоящее время я пытаюсь понять, как подключить интерфейс к django. Изучив онлайн, они советуют использовать модели, сериализаторы, но поскольку я выполняю загрузку через отдельный класс python, я не уверен, как соединить их с помощью этого метода. Я предполагаю, что мне нужно использовать HttpClient, чтобы каким-то образом подключиться к этому представлению?

Любая помощь будет принята с благодарностью. Спасибо

upload/views.py

 def clickToUpload(request):
if request.method == 'POST':
    if 'form' in request.POST:
        try:
            upload_instance = uploader(request.FILES['file'], request.POST['date'])
            _ = upload_instance.run_process('File', update_log=True)
            upload_message= "Success"
        except Exception as e:
            upload_message = 'Error: '   str(e)

     return render(request, 'Upload/upload.html', {'upload_message':upload_message})
 

Обновлено
views.py

 from rest_framework.response import Response
from rest_framework import status

def clickToUpload(request):
  if request.method == 'POST':
    if 'form' in request.POST:
        try:
            upload_instance = uploader(request.FILES['file'], request.POST['date'])
            _ = upload_instance.run_process('File', update_log=True)
            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

 export class FileUploadService {
  DJANGO_SERVER: string = "http://127.0.0.1:8000";
  constructor(private http:HttpClient) { }
  public upload(data: any) {
    return this.http.post<any>(`${this.DJANGO_SERVER}/lcr-upload/upload/`, data);
  }
}
 

upload.component.ts

 constructor(private fileUploadService: FileUploadService) { }

  ngOnInit(): void {
  }

  onChange(event: any) {
    this.file = event.target.files[0];
    console.log("This file is: "   this.file)
  }

  onUpload() {
    this.loading = !this.loading;
    console.log(this.file);
    this.fileUploadService.upload(this.file).subscribe(
      (event: any) => {
        if (typeof (event) === 'object') {
          this.shortLink = event.link;
          this.loading = false;
          console.log("OnUploadClicked")
        }
      }
    )
  }
}
 

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">
            <mat-datepicker-toggle matSuffix [for]="picker"></mat-datepicker-toggle>
            <mat-datepicker #picker></mat-datepicker>
        </mat-form-field>
    </div>
    <div class="input-group" style="font-size: 18px">
        <button class="btn btn-success" (click)="onUpload()">Upload</button>
    </div>
 

Ответ №1:

Таким образом, вам нужно будет изменить свой текущий clickToUpload на конечную точку API в Django, которая в основном принимает ваш файл как данные формы. Он не должен возвращать представление вашему шаблону. В Angular вы будете вызывать эту конечную точку API, когда пользователь загружает файл.

Пример API для загрузки файлов Django (views.py ):

 from rest_framework.response import Response
from rest_framework import status

def clickToUpload(request):
  if request.method == 'POST':
    if 'form' in request.POST:
        try:
            upload_instance = uploader(request.FILES['file'], request.POST['date'])
            _ = upload_instance.run_process('File', update_log=True)
            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)
 

После создания API вам нужно будет создать службу в Angular, которая вызывает конечную точку и передает загруженные данные формы. Здесь есть хороший учебник.

Комментарии:

1. Спасибо за это. Необходимо ли в вашем предложении создавать модель базы данных?

2. Да, поскольку вам нужно будет сохранить эту модель, верно?

3. Мы создали стандартный класс python, который использует sqlalchemy для записи / загрузки в базу данных. Мы обнаружили, что это быстрее, и в текущей настройке (с html-шаблоном на стороне Django) наша кнопка загрузки успешно выполняет запись в базу данных

4. Если ваш текущий код работает, просто преобразуйте возврат в ответ вместо представления, тогда вам не нужно использовать модель или сериализатор. Я могу обновить свой ответ, чтобы отразить это, если вы не уверены, что я имею в виду.

5. Если вы можете обновить свой ответ, это было бы здорово. Я довольно новичок в Angular, поэтому изо всех сил пытаюсь установить соединение. Спасибо за вашу помощь до сих пор