Как создать функцию 'Update Profile Picture' в django

Итак, в основном я создал функцию в django, где можно изменить картинку профиля, но проблема в том, что вместо этого она делает что-то другое. Посмотрите ниже, чтобы понять, что происходит

Я добавил эти коды в свой файл settings.py

settings.py

STATIC_URL = 'static/'

MEDIA_URL = '/media/'

MEDIA_ROOT = os.path.join(BASE_DIR, 'media/')

и также добавил их в urls.py

urls.py

from django.contrib import admin
from django.urls import path , include 
from django.conf.urls.static import static
from django.conf import settings 

urlpatterns = [
    path('admin/', admin.site.urls),
    path('user/',include('members.urls')),
    path('',include('blogposts.urls')), # MAIN URL 
    
]

if settings.DEBUG:
    urlpatterns += static(settings.MEDIA_URL,document_root = settings.MEDIA_ROOT)

Это модель, которую я создал для пользователя

models.py

class Profile(models.Model):
    user = models.OneToOneField(User,on_delete = models.CASCADE, null = True , blank = True )
    bio = models.TextField()
    profile_pic = models.ImageField(upload_to = 'images',default= '/../media/images/image.png')

    def __str__(self):
        return str(self.user)

Это форма, которую я создал для изменения фотографии профиля

forms.py

class ProfileForm(forms.ModelForm):
    class Meta:
        model = Profile 
        fields = ['profile_pic']

Это urls.py внутри приложения

urls.py (app)

from django.urls import path , include 
from . import views 


urlpatterns = [
    path('',views.homepage,name = 'home-page'),
    path('view_post/<int:pk>',views.view_post,name='view-post'),
    path('blogcreation',views.create_blog,name='blog-form'),

    path('aboutme',views.about_user,name = 'show-user'), # this is the one that takes to the page where you can change your profile picture and displays your bio

    path('delete/<int:pk>',views.delete_post,name = 'delete-post'),
    path('edit_blog/<int:pk>',views.edit_blog,name = 'edit-post'),
]

Вот коды в файле views.py

views.py

def about_user(request):

    profile = Profile.objects.all()

    if request.method == "POST":
        form = ProfileForm(request.POST,request.FILES)
        if form.is_valid():
            form.save()
            return render(request, 'show_user.html',{'form':form,'profile':profile})

    else:
        form = ProfileForm()
    return render(request, 'show_user.html',{'form':form,'profile':profile})

и наконец. Это show_user.html - моя html-страница.

show_user.html

{{user.profile.bio}}
<img src = "{{user.profile.profile_pic}}" height = "500">



<form method="POST" enctype="multipart/form-data">
    {% csrf_token %}
    {{ form.as_p }}
    <button type="submit">Upload</button>
</form>



и вот мои каталоги.

My Directory incase if you find something wrong

Теперь проблема в том, что биография моего профиля пользователя работает нормально, а профиль пользователя по умолчанию отображается.

show_user.html

Но когда я хочу изменить картинку, я нажимаю "выбрать файл" и выбираю случайную картинку, которая находится в моей медиа-папке

choosing download.png located at the same directory as the default profile picture

после выбора 'download.jpg' и его загрузки. Картинка не меняется, и вот что происходит.

The main issue

любые решения

Я не могу разобраться в этом и не могу найти никаких решений.

Когда вы создаете форму, Django не знает, что вы хотите обновить существующий Profile, поэтому он создает новый, что и вызывает проблему. Что вы можете сделать, так это предоставить форме инстанс, который вы пытаетесь обновить, и тогда Django автоматически обновит этот экземпляр. Сначала вам нужно получить экземпляр, который вы пытаетесь обновить, а затем добавить этот экземпляр в форму.

# views.py

def about_user(request):

    profile = Profile.objects.all()
    
    # get the instance of the Profile you are trying to update
    profile_instance = Profile.objects.get(user=request.user)

    if request.method == "POST":

        # Add that instance to the form, so Django knows which instance to update
        form = ProfileForm(request.POST,request.FILES, instance=profile_instance)
        if form.is_valid():
            form.save()
            return render(request, 'show_user.html',{'form':form,'profile':profile})

    else:
        form = ProfileForm()

    return render(request, 'show_user.html',{'form':form,'profile':profile})
Вернуться на верх