2013-03-10 14 views
27

Quando un utente si registra per la mia app. Ricevo questo errore quando raggiunge la pagina del profilo.Django L'attributo 'immagine' non ha un file associato con esso

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

penso che questo errore si verifica perché il mio modello richiede un'immagine e visto che appena registrata non può aggiungere un'immagine a meno che non andare alla pagina di modifica e aggiunge una pagina di poi si può accedere alla pagina del profilo.

mio profile.html

<h4>My Profile</h4> 

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


</ul> 
{% endif %} 

mio profilo funzione in 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}) 

ho provato questa soluzione con la creazione di un'istanza di 2 oggetto Person e li separa il mio modello con un se ma non ci riuscisse.

<h4>My Profile</h4> 

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

mie soluzioni alla funzione Profilo

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

Sto leggendo la documentazione per il modello incorporato nei tag di template e filtri Credo che una soluzione è quella di utilizzare (e) tag ma non riesco a usarlo correttamente.

Come posso configurare questo modello per rendere l'immagine un'opzione. Se la loro non è un'immagine, lascialo ma mostra il nome delle persone.

Grazie per avermi aiutato

+1

Il vero problema qui è Dj la decisione ango * ritardata * di generare un errore quando i file non esistono, dovrebbe invece restituire None. – s29

risposta

35

bob e person sono lo stesso oggetto,

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

modo da poter utilizzare solo persona per esso.

Nel modello, controllare image esiste o no prima,

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

L'approccio migliore che non violare DRY è quello di aggiungere un metodo di supporto alla classe del modello come:

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

e usa il filtro del modello default_if_none per fornire l'URL di default:

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