Подтвердить что ты не робот

Django Атрибут 'image' не имеет связанного с ним файла

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

The 'image' attribute has no file associated with it.
Exception Type: ValueError 
Error during template rendering
In template C:\o\mysite\pet\templates\profile.html, error at line 6
1 <h4>My Profile</h4>
2  
3 {% if person  %}
4 <ul>           
5   <li>Name: {{ person.name }}</li>
6   <br><img src="{{ person.image.url }}">
Traceback Switch back to interactive view
File "C:\o\mysite\pet\views.py" in Profile
 71.     return render(request,'profile.html',{'board':board ,'person':person})

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

Мой профиль .html

<h4>My Profile</h4>

{% if person  %}
<ul>           
    <li>Name: {{ person.name }}</li>
    <br><img src="{{ person.image.url }}">


</ul>
{% endif %}

Моя функция профиля на views.py

def Profile(request):
    if not request.user.is_authenticated():
        return HttpResponseRedirect(reverse('world:LoginRequest'))
    board = Board.objects.filter(user=request.user)
    person = Person.objects.get(user=request.user)
    return render(request,'profile.html',{'board':board ,'person':person})

Я попробовал это решение, создав 2 экземпляра объекта Person и разделив их на свой шаблон с помощью if, но это не удалось.

<h4>My Profile</h4>

{% if person  %}
<ul>           
    <li>Name: {{ person.name }}</li>
 </ul>
{% endif %}
{% if bob %}
<ul>           
<br><img src="{{ bob.image.url }}">
</ul>

Мои решения функции профиля

def Profile(request):
    if not request.user.is_authenticated():
        return HttpResponseRedirect(reverse('world:LoginRequest'))
    board = Board.objects.filter(user=request.user)
    person = Person.objects.get(user=request.user)
    bob = Person.objects.get(user=request.user)

    return render(request,'profile.html',{'board':board ,'person':person,'bob':bob})

Я читал документацию для встроенных тегов и фильтров шаблонов. Я думаю, что решение здесь - использовать (и) тег шаблона, но я не могу его правильно использовать.

Как настроить этот шаблон, чтобы сделать изображение опцией. Если у них нет изображения, оставьте его, но отобразите имя человека.

Спасибо, что помогли мне

4b9b3361

Ответ 1

bob и person - один и тот же объект,

person = Person.objects.get(user=request.user)
bob = Person.objects.get(user=request.user)

Таким образом, вы можете использовать для этого только человека.

В вашем шаблоне сначала проверьте image или нет,

{% if person.image %}
    <img src="{{ person.image.url }}">
{% endif %}

Ответ 2

Лучший подход, который бы не нарушал DRY, заключается в том, чтобы добавить вспомогательный метод к классу модели, например:

@property
def image_url(self):
    if self.image and hasattr(self.image, 'url'):
        return self.image.url

и используйте фильтр шаблонов default_if_none для предоставления URL-адреса по умолчанию:

<img src="{{ object.image_url|default_if_none:'#' }}" />

Ответ 3

Не совсем то, что ищет OP, но другим возможным решением было бы установить значение по умолчанию для ImageField:

 class Profile(models.Model):
    # rest of the fields here
    image = models.ImageField(
        upload_to='profile_pics/',
        default='profile_pics/default.jpg')