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

могу ли я загрузить изображение для всех новых пользователей в их профиль. Я создал страницу регистрации пользователя, так что когда пользователь отправил форму, новый профиль будет создан автоматически, используя Django Signals проблема, с которой я столкнулся сейчас: когда новый пользователь создан и перенаправлен на главную страницу, когда пользователь нажимает на страницу профиля, страница профиля выбрасывает ошибку, подобную этой:

ValueError at /profile/15/
The 'profile_image' attribute has no file associated with it.

и он выделил этот html-код на странице:

<img class="card-img-top" src="{{profile.profile_image.url}}" alt="Card image cap">

Могу ли я загрузить изображение для всех новых пользователей в их профиль, чтобы избежать сообщения об ошибке в шаблоне. Так же, как я делаю автоматический профиль для всех новых пользователей.

моя модель:

class Profile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    profile_image = models.ImageField(upload_to='avatar', blank=True, null=True)
    stories = RichTextField(blank=True, null=True)
    twitter = models.URLField(max_length=300, blank=True, null=True)
    website = models.URLField(max_length=300,blank=True, null=True)
    city = models.CharField(max_length=50, blank=True, null=True)
    location = models.CharField(max_length=80, blank=True, null=True)
    slug = models.SlugField(unique=True, max_length=200)

    def save(self, *args, **kwargs):
        self.slug = slugify(self.user)
        super(Profile, self).save(*args, **kwargs)

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

файл signals.py:

from django.conf import settings 
from django.db.models.signals import post_save
from django.dispatch import receiver
from . models import Profile

User = settings.AUTH_USER_MODEL

#this function wake up after a User object save
@receiver(post_save, sender=User)
def create_profile(sender, instance, created, **kwargs):
    if created:
        Profile.objects.create(user=instance)

шаблон профиля:

  <div class="container">
    {% for profile in profiles %}
    <div class="row justify-content-center">
        <div class="card" style="width: 18rem;">
            <img class="card-img-top" src="{{profile.profile_image.url}}" alt="Card image cap">
            <div class="card-body">
                <a href="{% url 'edit' profile.slug %}">Edit</a>
                <a href="{{profile.website}}">My website</a>
                <a href="{{profile.twitter}}">My twitter</a> 
                <p>{{profile.city}}</p>    
                <p>{{profile.location}}</p> 
                <p>{{profile.stories}}</p>            
            </div>
          </div>
    </div>
    {% endfor %}
</div>

мои взгляды:

def profile(request, pk):
    profiles = Profile.objects.filter(user=request.user)
    questions = Question.objects.filter(user=request.user)
    context = {
        'profiles':profiles,
        'questions':questions
    }
    return render(request, 'profile.html', context)

def register(request):
    if request.method == 'POST':
        username = request.POST['username']
        first_name = request.POST['first_name']
        last_name = request.POST['last_name']
        email = request.POST['email']
        password = request.POST['password']
        password2 = request.POST['password2']

        if password == password2:
            if User.objects.filter(email=email).exists():
                messages.info(request, 'Email or user name Already taking')
                return redirect('register')
            elif User.objects.filter(username=username).exists():
                messages.info(request, 'username is taken')
                return redirect('register')
            else:
                user = User.objects.create_user(username=username, first_name=first_name, 
                last_name=last_name, email=email, password=password)
                user.save();
                return redirect('login')
        else:
            messages.info(request, 'Password Not Match')
            return redirect('register')   
        return redirect ('/')     
    else:
        return render(request, 'signup.html')

Установите по умолчанию в модели ImageField файл изображения в статической секции

profile_image = models.ImageField(upload_to='avatar', blank=True, null=True, default='path/to/static/default_user_image.jpg')

При переносе базы данных он будет добавлен в пустые поля изображений пользователя, и вы сможете обновить его, загрузив другой файл изображения с тем же именем. Это также предотвратит создание нескольких копий одного и того же файла.

Вы можете использовать этот подход.

Вместе с media folder вы можете добавить изображение под названием default.png или default.jpg.

Теперь внутри вашего файла models.py вы можете иметь:

class Profile(models.Model):
     ...
     # setting the default image from here if none was uploaded when creating the profile
     # passing the name of the image to the default attribute
     profile_image = models.ImageField(upload_to='avatar', blank=True, null=True, default='default.jpg')
     ...

Кроме того, вы можете сделать проверку (из шаблона) на то, есть ли у данного профиля изображение:

{% if profile.profile_image %}
     <img class="card-img-top" src="{{ profile.profile_image.url }}" alt="Card image cap">
{% endif %}

Я бы предложил добавить оба вышеперечисленных пункта к тому, что у вас есть.

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