Моя форма не может получить 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-запроса, когда пользователь обновляет браузер. браузер.

Вернуться на верх