Объект '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.

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