Объект 'NoneType' не имеет атрибута 'profile'
Пытаюсь обновить изображение профиля для моделей студентов, но получаю ошибку. У объекта 'NoneType' нет атрибута 'profile'. Не знаю, имеет ли это какое-то отношение к views.py, но, вероятно, имеет.
Мой views.py для пользовательского приложения:
from django.contrib.auth.decorators import login_required
from .forms import UpdateProfileForm
from django.contrib import messages
from main.models import Student
from .models import Profile
@login_required
def profile(request):
if request.method == 'POST':
student = request.POST.get('student')
p_form = UpdateProfileForm(
request.POST, request.FILES, instance=student.profile)
if p_form.is_valid():
p_form.save()
messages.success(request, f'Student picture has been updated!')
return redirect('student_profiles')
else:
p_form = UpdateProfileForm()
context = {
'p_form': p_form,
'students': Student.objects.all()
}
return render(request, 'user/profiles.html', context)
Signals.py:
from django.dispatch import receiver
from main.models import Student
from django.contrib.auth.models import User
from .models import Profile
@receiver(post_save, sender=Student)
def create_profile(sender, instance, created, **kwargs):
if created:
Profile.objects.create(student=instance)
@receiver(post_save, sender=Student)
def update_profile(sender, instance, created, **kwargs):
if created == False:
instance.profile.save()
Модель профиля:
from main.models import Student
from PIL import Image
class Profile(models.Model):
student = models.OneToOneField(
Student, default=None, null=True, on_delete=models.CASCADE, related_name="profile")
image = models.ImageField(default='default.jpg', upload_to='profile_pics')
def __str__(self):
return f'{self.student.firstname} {self.student.surname} Profile'
def save(self, *args, **kwargs):
super(Profile, self).save(*args, **kwargs)
img = Image.open(self.image.path)
if img.height > 300 or img.width > 300:
output_size = (300, 300)
img.thumbnail(output_size)
img.save(self.image.path)
https://i.stack.imgur.com/sXJEk.png
А это мой профиль.html:
{% load crispy_forms_tags %}
{% block content %}
{% for student in students %}
<div class="content-section">
<div class="media">
<img class="rounded-circle account-img" src="{{ student.profile.image.url }}">
<div class="media-body">
<h2 class="account-heading"></h2>
<p class="text-secondary"></p>
</div>
</div>
<form method="POST" enctype='multipart/form-data'>
{% csrf_token %}
<fieldset class="form-group">
<legend class="border-bottom mb-4">{{ student.firstname }} {{ student.surname }}</legend>
{{ p_form|crispy }}
</fieldset>
<div class="form-group">
<button class="btn btn-outline-info" type="submit">Update</button>
</div>
</form>
</div>
{% endfor %}
{% endblock content %}
После student = request.POST.get('student') сделать a
if not student:
messages.success(request, f'No student value passed to POST')
Я использую messages.success только в целях регистрации. Похоже, что ваша проблема находится на вашем слое template, а не на view.