Как добавить изображение в пользовательскую модель пользователя Django (AbstractUser)?

Я пытаюсь добавить 'image' в класс, который расширяет AbstractUser. Я хотел бы узнать, как я могу использовать fetch api, чтобы сделать post запрос (vuejs) так, чтобы он вызывал views.py api и специально загружал изображение для пользователя.

Я понимаю, как это будет работать, когда речь идет о фронтенде, но я не знаю, что будет делать мой django views.py api, предполагая, что я хочу, чтобы он только принимал объект файла и просто добавлял его соответствующему пользователю.

Я следовал нижеприведенному руководству, однако, они предполагают, что используется DRF, а не api, просто сделанный в views.py. Поэтому я не уверен, что мой api должен будет делать с объектом изображения, который я передаю с помощью formData https://www.youtube.com/watch?v=4tpMG6btI1Q

Я видел нижеприведенный пост SO, но в нем нет прямого ответа на то, что будет делать мой views.py api. То есть, будет ли он просто хранить изображение в определенном формате? URL?

Добавьте изображение профиля в модель Django Custom User(AbstractUser)

class CUser(AbstractUser):    
    image = models.ImageField(upload_to='uploads/', blank=True, null=True)
    
    def __str__(self):
        return f"{self.first_name}"

Если я правильно понимаю, вы хотите загрузить изображение (в процессе создания пользователя) ajax способом. Ниже приведены общие настройки и коды для загрузки изображения и сохранения экземпляра модели.

Сначала необходимо установить подушку для использования ImageField

pip install pillow

И создайте папку 'media' для сохранения загруженных изображений (тот же уровень в manage.py)

settings.py

В Djnago необходимо указать, куда сохранить изображение.

Я видел нижеследующий пост SO, но он не касается непосредственно того, что мой views.py api будет делать. То есть, будет ли он просто хранить изображение в определенном формате? URL?

MEDIA_ROOT и MEDIA_URL оба необходимы, один для внутреннего использования (хранение изображений на сервере), а другой для пользователя

import os
# Build paths inside the project like this: BASE_DIR / 'subdir'.
BASE_DIR = Path(__file__).resolve().parent.parent

MEDIA_URL = '/media/'       # trailing slash is needed.
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')

models.py

ImageTest - это модель для тестирования загрузки изображения. Вы можете использовать ее в своем CUser с небольшими изменениями.

from django.db import models

# Create your models here.
class ImageTest(models.Model):
    image = models.ImageField(upload_to='avatar')   # uploaded photo saved in MEDIA_ROOT/avatar/
                                                    # ex) media/avatar/pic.jpg

admin.py

from django.contrib import admin
from .models import ImageTest

class ImageTestAdmin(admin.ModelAdmin):
    fields = ('image',)
    list_display = ['id', 'image']

admin.site.register(ImageTest, ImageTestAdmin)

views.py

create-user - это представление для предоставления пользователю формы загрузки, а ajax-create-user - обработчик для сохранения изображения и экземпляра ImageTest.

from django.shortcuts import render
from django.http import HttpResponse
from .models import ImageTest
# Create your views here.

def create_user(request):
    context = {'msg':'upload image'}
    return render(request, 'templates/upload.html', context)
    
def ajax_create_user(request):
    if request.method == 'POST':
        user = ImageTest(image=request.FILES['avatar'])
        user.save()
    return HttpResponse('uploading image success')

upload.html

Шаблон для рендеринга формы загрузки. Напишите здесь свои vuejs коды.

{{msg}}

<form action="{% url 'ajax-create-user' %}" method="post" enctype="multipart/form-data">
    {% csrf_token %}
    <input type="file" id="avatar" name="avatar" accept="image/*">
    <button type="submit">Submit</button>
</form>

urls.py

Давайте соединим представления и урлы.

from django.contrib import admin
from django.urls import path

from anthony import views
from django.conf import settings
from django.conf.urls.static import static

urlpatterns = [
    path('admin/', admin.site.urls),
    path('anthony/', views.create_user, name='create-user'),
    path('anthony/ajax-create-user', views.ajax_create_user, name='ajax-create-user'),
]

# for development environment(no needed in production)
if settings.DEBUG:
    urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

Summary

  1. Изображение передается представлениям через html-форму.
  2. Виды могут получить доступ к изображению в request.FILES(или request.POST)
  3. .
  4. Присвойте изображение полю Model и сохраните экземпляр. Оба варианта сохраняются автоматически.
Вернуться на верх