Моя форма не может получить request.files. У меня есть проблема, что фото профиля пользователя не может быть загружено. img отправляется через метод request правильно
** views.py **
def create_user(request):
if request.method == 'POST':
form = UserProfile(request.POST)
user_photo = PhotoUser(request.FILES,request.POST) #instance=request.user.userphoto
print(request.FILES) * here i can see my image went trough *
if form.is_valid():
form.save()
else:
form = UserProfile()
user_photo = PhotoUser()
return render(request,'user/user.html',{'form':form,'user_photo':user_photo})
** urls.py**
urlpatterns = [
path('admin/', admin.site.urls),
path('', views.exe,name='exe'),
path('books/', include('books.urls')),
path('user/', include('user.urls')),
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
** signals.py**
@receiver(post_save,sender=User)
def create_profile(sender, instance, created, **kwargs):
if created:
UserPhoto.objects.create(user=instance)
@receiver(post_save, sender=User)
def save_profile(sender, instance, **kwargs):
instance.userphoto.save()
** models.py **
class UserPhoto(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
img = models.ImageField(upload_to=image_directory_path,default='avatar.png',blank=True,null=True)
def __str__(self):
return self.user.username
** html**
<form method="post" enctype="multipart/form-data" action=".">
{% csrf_token %}
{{form}}
{{user_photo}}
<input type="file" name="img" accept="image/*" id="id_img">
<input type="submit" value="Submit">
</form>
forms.py
class PhotoUser(forms.ModelForm):
class Meta:
model = UserPhoto
fields = ['img']
MEDIA_ROOT = (BASE_DIR / 'media')
MEDIA_URL = '/media/'
все работает нормально, но изображения профилей пользователей не загружаются.
сигналы выполняются правильно и 2 модели подключены и мой аватар.png загружается каждому пользователю и пользователь сохраняется.
если я загружаю фото пользователя через админку, оно работает правильно
Пожалуйста, уберитесигнал для создания UserPhoto
, это приведет к тому, что форма и сигнал пытаются создать и UserPhoto
, и поэтому один из двух будет неудачным, в данном случае это будет PhotoUser
форма. Более того, использование сигналов часто приводит к проблемам , и только в определенных случаях они эффективны.
Вы можете реализовать представление, которое будет создавать UserPhoto
, связанное с вошедшим в систему пользователем:
# remove the create_profile signal
def create_user(request):
if request.method == 'POST':
form = UserProfile(request.POST)
user_photo = PhotoUser(request.FILES, request.POST) #instance=request.user.userphoto
if form.is_valid() and user_photo.is_valid():
user = form.save()
user_photo.instance.user = user
user_photo.save()
return redirect('name-of-some-view')
else:
form = UserProfile()
user_photo = PhotoUser()
return render(request,'user/user.html',{'form':form,'user_photo':user_photo})
Примечание: В случае успешного POST запроса, вы должны сделать
redirect
. [Django-doc] для реализации паттерна Post/Redirect/Get [wiki]. Это позволяет избежать повторения POST-запроса, когда пользователь обновляет браузер. браузер.