Сложности с обновлением данных модели User через форму
Моя проблема заключается в том, что я хочу обновлять фото профиля пользователя через форму на сайте. Мой код не выводит ошибок и аватарки при отправки формы сохраняются по пути /media/avatars/ удачно. Но при этом при обновления страницы профиля или переходе в профиль пользователя в admin панели, аватарка не меняется и сохраняется предыдущей. Само изменение аватарки через admin панель также работает хорошо. Был бы очень благодарен за любую подсказку. Ранее были проблемы с уточнением присваивания аватарки конкретному пользователю, но эта строчка кода: instance=request.user мне помогла. Не могут ли быть проблемы например в ней?
Models.py:
from django.db import models
from django.contrib.auth.models import User
from django.db.models.signals import post_save
from django.dispatch import receiver
class Kind(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE, related_name='profile')
avatar = models.ImageField(null=True, blank=True, upload_to="avatars/", verbose_name='Изображение')
kind = models.CharField(max_length=1, verbose_name='Пол')
@receiver(post_save, sender=User)
def create_user_profile(sender, instance, created, **kwargs):
if created:
Kind.objects.create(user=instance)
@receiver(post_save, sender=User)
def save_user_profile(sender, instance, **kwargs):
instance.profile.save()
Forms.py:
from .models import Kind
from django.forms import ModelForm
class BookForm(ModelForm):
class Meta:
model = Kind
fields = ['avatar']
Views.py:
from django.contrib.auth import authenticate, login
from django.shortcuts import render, redirect
from django.core.files.storage import FileSystemStorage
from Вход.forms import *
from .models import *
def profilee(request):
if not request.user.is_authenticated:
return redirect("/accounts/login")
else:
if request.method == 'POST':
form = BookForm(request.POST, request.FILES, instance=request.user)
if form.is_valid():
form.save()
else:
form = BookForm()
return render(request, 'registration/profile.html', {'form' : form})
def LogoutView(request):
return redirect("/accounts/login")
Template:
<div>
{% if not user.profile.avatar %}
{% if user.profile.kind == "М" %}
<div class="block">
<img src="{% static 'image/m.png' %}" class="img-lg rounded-circle mb-4 imagero round" alt="image">
</div>
{% endif %}
{% if user.profile.kind == "Ж" %}
<div class="block">
<img src="{% static 'image/j.png' %}" class="img-lg rounded-circle mb-4 imagero round" alt="image">
</div>
{% endif %}
{% endif %}
{% if user.profile.avatar %}
<img src="{{ user.profile.avatar.url }}" class="img-lg rounded-circle mb-4 imagero round" alt="image">
{% endif %}
<form method = "post" enctype="multipart/form-data">
{% csrf_token %}
{{ form.as_p }}
<button type="submit">Upload</button>
</form>
<h4>{% if user.first_name %}{{ user.first_name }}{% endif %} {% if user.last_name %}{{
user.last_name }}{% endif %}</h4>
<p class="text-muted mb-0">Social Activist</p>
</div>
При запросе POST, после if form.is_valid():
obj = form.save(commit=False)
obj.user = request.user
obj.save()
Так-же вам стоит убрать instance=request.user т.к. форма ожидает в качестве instance получить объект типа Kind, а вы передаете User
При запросе GET:
- Чтобы заполнить форму объектом
Kindтекущего юзера:form = BookForm(instance=request.user.kind)