2015-11-22 15 views
5

Sono nuovo di Django e sono confuso con il problema di visualizzazione dell'immagine. Ora ho un'immagine di word-cloud generata nel back-end (diciamo topicWords.py) e non so molto per affrontarla. (1) Come posso memorizzarlo nel campo immagine del modello UserProfile? Nel models.py, ho:Come visualizzare un'immagine che viene generata nel back-end con Django

class UserProfile(models.Model): 
user = models.OneToOneField(User) 
tagcloud = models.ImageField(upload_to ='rap_song/raptle/pic/') 

E 'giusta da fare direttamente come:

user.userprofile.tagcloud = wC#wc is the image generated 

(2) Che cosa si deve l'impostazione di root_supporto e MEDIA_URL essere?

(3) Come dovrei visualizzarlo nel .html?

<img src = "???"> 

Grazie mille!

+0

Che significa 'wc' avere? È un nome di percorso o un file come oggetto? –

+0

@ HåkenLid È un oggetto immagine. – yobichi

risposta

0

MEDIA_URL dovrebbe essere simile a questo:

MEDIA_ROOT='(the full path to the media folder)' (i.e: '/home/jason/work/project/media/') 
MEDIA_URL='/media/' 

E aggiungere queste righe alla fine del urls.py del file:

urlpatterns += staticfiles_urlpatterns() 
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) 

è possibile accedervi nei modelli di utilizzo:

<img src = "{{ user.userprofile.tagcloud.url }}"> 

Se si desidera impostare manualmente un percorso ImageField in Django, è possibile salvare il file immagine e quindi impostare il valore del percorso quando si salva l'istanza del modello. È possibile consultare questo link per maggiori informazioni su di esso.

+0

Grazie per la risposta! Quindi nel mio models.py non dovrei caricare l'immagine all'indirizzo precedente? Devo impostarlo come lo stesso con MEDIA_ROOT? – yobichi

+0

@yobichi - se 'upload_to =" foo "', allora la foto andrebbe nella sottodirectory "pippo" di 'MEDIA_ROOT'. – JRodDynamite

+0

Trovato! Quindi, finalmente il codice user.userprofile.tagcloud.url può scegliere quello giusto di un determinato utente anche se tutte le immagini sono nella directory sam? (Voglio votare per te ma sembra che non possa ...) – yobichi

0

settings.py

MEIDA_URL = '/pic/' 
MEDIA_ROOT = os.path.join(REPOSITORY_ROOT, 'pic/') 

STATIC_URL = '/static/' 
STATIC_ROOT = os.path.join(REPOSITORY_ROOT, 'static/') 
STATICFILES_DIRS = (
os.path.join(BASE_DIR, "static"), 
'/var/www/static/', 
) 

urls.py

from django.conf.urls import include, url 
from django.contrib import admin 
from django.conf import settings 
from django.contrib.staticfiles.urls import staticfiles_urlpatterns 
from django.conf.urls.static import static 

urlpatterns = [ 
...... 
] + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT) 
urlpatterns += staticfiles_urlpatterns() 

models.py

class UserProfile(models.Model): 
user = models.OneToOneField(User) 
tagcloud = models.ImageField(upload_to ='rapper/') 

topicWords.py

d = path.dirname("/rapper/") 


wc = WordCloud(background_color="white", max_words=2000, font_path='WeibeiSC-Bold.otf') 
# generate word cloud 
wc.generate_from_frequencies(word_tag) 
# save to the "rapper/", right? 
wc.to_file(path.join(d,"rapper1.png")) 

userprofile.tagcloud = "rapper/rapper1.png" 
userprofile.save() 
0

Django models.ImageField ha un metodo save() ereditato da FileField, che di solito è quello che si desidera utilizzare durante la generazione di immagini sul server. Questo metodo si prende cura di upload_to e funziona anche con altri back-end di archiviazione file.

from io import BytesIO 
# Or if you use python 2: 
# from StringIO import StringIO as BytesIO 
from PIL import Image 
from django.core.files.base import ContentFile 

wc = Image() # Create the image somehow 
filename = 'filename.png' # Make a filename as well 

in_memory_file = BytesIO() 
wc.save(in_memory_file) 
profile_image = ContentFile(in_memory_file.getvalue()) 
user.userprofile.tagcloud.save(name=filename, content=profile_image, save=False) 
user.userprofile.save() 

Documenti: https://docs.djangoproject.com/en/1.8/ref/models/fields/#django.db.models.fields.files.FieldFile.save

FieldFile.save(name, content, save=True)

Takes two required arguments: name which is the name of the file, and content which is an object containing the file’s contents. The optional save argument controls whether or not the model instance is saved after the file associated with this field has been altered. Defaults to True .

Note that the content argument should be an instance of django.core.files.File , not Python’s built-in file object.

+0

Grazie per la risposta! Ma forse dovrebbe essere user.userprofile.tagcloud.save ('filename.png', content = wc, True)? Ma ho ancora un errore di Impossibile forzare sia l'inserimento che l'aggiornamento nel salvataggio del modello. Hai qualche altra idea? – yobichi

+0

Probabilmente dovresti usare 'save = False' se l'istanza del modello non è ancora stata salvata nel database. –

+0

Ho aggiunto alcuni passaggi necessari per il salvataggio di un oggetto 'PIL.Image'. Puoi trovare ulteriori informazioni in questa risposta a una domanda simile: http://stackoverflow.com/a/4544525/1977847 –