@cyberic-icus

Не загружаются изображения в Django?

Доброго времени суток, на днях столкнулся с такой проблемой: изображения перестали передаваться через формы. У меня два приложения, которые используют ImageField - CustomUser и UserGroup, оба - расширения уже существующих моделей Django(см. код ниже).

Как только заметил проблему, решил откатить до того момента, когда всё работало(в этой версии у меня только модель CustomUser), но... и здесь они перестали передаваться, хотя всё должно работать. Создал новое окружение, не помогло. Поискал в интернете - добавил в форму атрибут enctype="multipart/form-data"(раньше и без него всё отлично работало). Вроде заработало, однако, как по мне, это так себе решение.

Прошу совета у знающих людей.

# models.py

from django.db import models
from django.urls import reverse
from django.contrib.auth.models import AbstractUser

class CustomUser(AbstractUser):
	photo = models.ImageField(upload_to='profile_pics/', defaul='default.jpg')
	
	def __str__(self):
		return self.username
	
	def get_absolute_url(self):
		return reverse('users:users-single', kwargs={'username':self.username})

# =============================================
# forms.py

from django import forms
from django.contrib.auth.forms import UserCreationForm, UserChangeForm

from django.contrib.auth import get_user_model
User = get_user_model()

class CustomUserCreationForm(UserCreationForm):
	class Meta:
		model = User
		fields = (
			'username', 
			'email', 
			'first_name', 
			'last_name', 
			'photo')
		
class CustomUserChangeForm(UserChangeForm):
	password = None
	class Meta:
		model = User
		fields = ('photo',)

# =============================================
# views.py 

class UserRegisterView(CreateView):
	form_class = CustomUserCreationForm
	template_name = 'users/register.html'
	success_url = 'users/login/'
	
	def form_valid(self, form):
		if self.request.recaptcha_is_valid:
			form.save()
			return super().form_valid(form)

class UserUpdateView(UserPassesTestMixin, LoginRequiredMixin, UpdateView):
	fields = ['email', 'first_name', 'last_name', 'photo']
	template_name = 'users/update.html'
	
	def get_success_url(self):
		username_ = self.request.user.username
		return reverse_lazy('users:users-single', kwargs={'username':username_})
	
	def get_object(self):
		username_ = self.kwargs.get('username')
		return get_object_or_404(CustomUser, username=username_)
	
	def test_func(self):
		post = self.get_object()
		if self.request.user.username == self.kwargs.get('username'):
			return True
		return False

# =============================================
# urls.py 

urlpatterns =[ 
...
] + static(settings.MEDIA_URL, document_root = settings.MEDIA_ROOT).

# =============================================
# settings.py

MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
  • Вопрос задан
  • 491 просмотр
Решения вопроса 1
Что же вас смутило в enctype="multipart/form-data"? Это как я знаю единственное правильное решение. Без этого атрибута, файлы не будут передаваться вообще!
Так что ответ на вопрос прост: используйте атрибут enctype="multipart/form-data" в форме!
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы