Как создать функцию '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>
и вот мои каталоги.
Теперь проблема в том, что биография моего профиля пользователя работает нормально, а профиль пользователя по умолчанию отображается.
Но когда я хочу изменить картинку, я нажимаю "выбрать файл" и выбираю случайную картинку, которая находится в моей медиа-папке
после выбора 'download.jpg' и его загрузки. Картинка не меняется, и вот что происходит.
любые решения
Я не могу разобраться в этом и не могу найти никаких решений.
Когда вы создаете форму, 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})