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})
Я читал документацию для встроенных тегов и фильтров шаблонов. Я думаю, что решение здесь - использовать (и) тег шаблона, но я не могу его правильно использовать.
Как настроить этот шаблон, чтобы сделать изображение опцией. Если у них нет изображения, оставьте его, но отобразите имя человека.
Спасибо, что помогли мне
Ответы
Ответ 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')