Как добавить изображение в пользовательскую модель пользователя 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
- Изображение передается представлениям через html-форму.
- Виды могут получить доступ к изображению в request.FILES(или request.POST) .
- Присвойте изображение полю Model и сохраните экземпляр. Оба варианта сохраняются автоматически.