2013-03-10 6 views
27

Gdy użytkownik zarejestruje się dla mojej aplikacji. Otrzymuję ten błąd po dotarciu do strony profilu.Django Atrybut "image" nie ma z nim żadnego pliku

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}) 

myślę, że ten błąd zdarza się, ponieważ mój szablon wymaga obrazu i widział tylko on zarejestrowany nie może dodać obraz, chyba że przejdź do strony edycji i dodaje stronę potem może uzyskać dostęp do strony profilu.

Moja profile.html

<h4>My Profile</h4> 

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


</ul> 
{% endif %} 

Mój profil funkcja w 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}) 

próbowałem tego rozwiązania poprzez utworzenie 2 instancję obiektu osoba i oddzielając je na mój szablon z gdyby to się nie udało.

<h4>My Profile</h4> 

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

Moi rozwiązania funkcji Profile

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}) 

ja czytam dokumentację do wbudowania w tagach szablonów i filtrów myślę tu rozwiązaniem jest użycie szablonu (i) tag, ale nie mogę go poprawnie użyć.

Jak skonfigurować ten szablon, aby zdjęcie było opcją. Jeśli ich nie ma, zostaw to, ale wyświetl imię osoby.

Dziękuję za pomoc

+1

Prawdziwym problemem jest tutaj Dj ango * opóźniona * decyzja o zgłoszeniu błędu, gdy pliki nie istnieją, zamiast tego powinna po prostu zwrócić Brak. – s29

Odpowiedz

35

bob i person to ten sam obiekt,

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

Więc można używać tylko osoby dla niego.

W szablonie, sprawdź image istnieje lub nie pierwszy

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

lepszym rozwiązaniem, które nie naruszają DRY jest dodanie metody pomocnika do klasy modeli jak:

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

i użyj domyślnego filtra szablonu default_if_none, aby podać domyślny adres URL:

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