How to show model images in Django? - python

I have such models.py file
class Product(models.Model):
CATEGORIES = {
('Computer', 'Комп\'ютер'),
('Smartphone', 'Смартфон')
}
photo = models.ImageField(upload_to='images/', blank=True)
title = models.CharField(max_length=128, blank=False)
description = models.CharField(max_length=5000, blank=False)
price = models.PositiveIntegerField(blank=False)
category = models.CharField(max_length=30, choices=CATEGORIES)
count = models.PositiveIntegerField(blank=False)
In settings.py i DON'T have media variables/dirs
Also i try to show images in such way
{% extends 'base.html' %}
{% block title %}Каталог{% endblock %}
{% block content %}
{% for i in products %}
<img src="{ static i.photo.url }">
{{i.title}}
{% endfor %}
{% endblock %}
Result:
I add my model objects in Django Admin

please see below configuration, have you done?
urls.py
from django.conf import settings
from django.conf.urls.static import static
urlpatterns = [
# urls/path
]+ static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
settings.py
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
MEDIA_URL = '/media/'
your HTML file
{% if i.photo %}
<img src="{{ i.photo.url }}">
{% endif %}

You don't need the static tag.
<img src="{{ i.photo.url }}">

You can add like this.
and run the collectstatic command to
<img src="{% static '/logo.png' %}"/>
python manage.py collectstatic

In settings.py i DON'T have media variables/dirs
you have to set MEDIA_ROOT and MEDIA_URL in settings.py and set the URL of each in urls.py because by default, Django stores files locally, using the MEDIA_ROOT and MEDIA_URL settings. The examples below assume that you’re using these defaults.
check the official doc.
step - 1
configure media and static files like this
add this in your settings.py
STATIC_ROOT = BASE_DIR / 'static_cdn'
STATIC_URL = '/static/'
MEDIA_ROOT = BASE_DIR / 'media'
MEDIA_URL = '/media/'
STATICFILES_DIRS = [
BASE_DIR / "static",
]
and add this in your urls.py
from django.conf import settings
from django.conf.urls.static import static
urlpatterns = [
# ... the rest of your URLconf goes here ...
]
if settings.DEBUG:
urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

Related

Error when trying to display a video in django

I'm trying to make a video display randomly on my homepage. A user is able to upload a video and it would be saved to a document in media/documents as well as to a dataset. I tried the code below and it keeps giving me an error,
Exception Type: TemplateSyntaxError at /
Exception Value: 'media' is not a registered tag library. Must be one of:
admin_list
admin_modify
admin_static
admin_urls
cache
i18n
l10n
log
static
staticfiles
tz
I removed if settings.DEBUG: from urls.py and added .url to {% media 'doc.document.url' %}, however this didn't work.
home.html
{% load media %}
{% for doc in document %}
<video width='320' height= '240' controls>
<source src="{% media 'doc.document.url' %}" type='video/mp4'>
Your browser does not support the video tag.
</video>
{% endfor %}
models.py
from django.db import models
from datetime import datetime
from django.contrib.auth.models import User
from django.conf import settings
...
class Document(models.Model):
title = models.CharField(max_length=100, default='NoTitle')
description = models.CharField(max_length=255, blank=True)
document = models.FileField(upload_to='documents/')
uploaded_at = models.DateTimeField("date published")#(auto_now_add=True)
creator = models.ForeignKey('auth.User', on_delete=models.CASCADE, blank=True, null=True)
def __str__(self):
return self.title
urls.py
urlpatterns = [
path('admin/', admin.site.urls),
path("", views.homepage, name="homepage"),
path("myconta/", views.myconta, name="myconta"),
path("upload/", views.model_form_upload, name="upload"),
path("register/", views.register, name="register"),
path('', include("django.contrib.auth.urls")),
]
#if settings.DEBUG:
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
views.py
def homepage(request):
return render(request=request, template_name="main/home.html", context={"sites": Info.objects.all})
return render(request=request, template_name="main/home.html", context={"document": Document.objects.all})
settings.py
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'main.apps.MainConfig',
]
STATIC_URL = '/static/'
MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
Directories
MySite
-main
-__pycache__
-migrations
-static
-images
main.css
-templates
[all my html code]
init
admin.py
apps.py
forms.py
models.py
tests.py
urls.py
views.py
-media
-documents
-mysite
-pycache
init.py
settings.py
urls.py
wsgi.py
db.sqlite3
home.html
{% load media %}
{% for doc in document %}
<video width='320' height= '240' controls>
<source src="{{ MEDIA_URL }} {{ doc.document.url }}" type='video/mp4'>
Your browser does not support the video tag.
</video>
{% endfor %}
settings.py
MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
MEDIA_PATH = os.path.join(BASE_DIR, '/media/')

Django - Unable to display an image from folder within media folder

I am trying to load an image from a folder within 'media' folder (media/tshrirts) onto template using django. Below is my settings.py
STATIC_URL = '/static/'
STATICFILES_DIRS = [
os.path.join(BASE_DIR, "static"),
]
MEDIA_URL = '/media/'
#MEDIA_ROOT = os.path.join(BASE_DIR,'media')
MEDIA_ROOT = 'media'
**I tried both the roots none of them work.
Below is my models.py
from django.db import models
# Create your models here.
class tshirts(models.Model):
brand=models.CharField(max_length=50)
name=models.CharField(max_length=100)
price=models.DecimalField(max_digits=10, decimal_places=2)
image = models.ImageField(upload_to='tshirts/')
def __str__(self):
return self.name
this is part of the tshirts.html Why image.url is none??
<div class='tshirts'>
{% for eachtshirt in alltshirts %}
<div class='tshirt'>
{{eachtshirt.brand}}
<p>{{eachtshirt.name}}</p>
<p>{{eachtshirt.price}}</p>
<img src="{{eachshirt.image.url}}"/>
{% if eachshirt.image.url == None %}
<p>{{"Image Not Found"}}</p>
{% endif %}
</div>
{% endfor %}
</div>
finally, urls.py
urlpatterns = [
.
.
.
url(r'^tshirts/',include('tshirts.urls')),
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
After I uploaded the image as an admin and clicked the link, the image was properly displayed.
http://127.0.0.1:8000/media/tshirts/t-shirt2.jpg - the image was displayed here.
How can I fix this, please let me know thanks!!!
Screenshot for the page
The root of your media, should include the BASE_DIR, like the following:
MEDIA_ROOT = os.path.join(BASE_DIR,'media')
MEDIA_URL = '/media/'
You have a typo in your template, you'are accessing {{eachshirt.image.url}} without t. the correct is
{{eachtshirt.image.url}} <!-- with t : each tshirt -->

I can't see ImageField's photos in DJango's view [Solve]

something fail in my Django project, because the images that I load in the imagefields don't show in the view.
https://www.dropbox.com/sh/fvx6sfmxgm08xo6/AABVR-AQGeF52pCxlzVaLuDaa?dl=0
The crab's photo it's load with "static", but the second, that it's imagefield's photo.
enter image description here
Model:
class foto(models.Model):
nombre=models.CharField(max_length=50)
imagen=models.ImageField(upload_to='fotos/')
def __str__(self):
return self.nombre
View:
def general(request):
lista=foto.objects.all()
context={'material':lista}
return render(request,'indice.html',context)
settings:
STATIC_URL = '/static/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
MEDIA_URL = '/media/'
STATICFILES_DIRS = (
'/media/fotos/',
)
html:
{% load staticfiles %}
<html>
<head>
<title>Album de fotos</title>
</head>
<body>
<img src="{% static 'cangrejo.jpg' %}" />
{% if material %}
{% for a in material %}
<li>{{a.nombre}}: {{a.imagen}}</li>
<img src="{{a.imagen}}" />
{% endfor %}
{% else %}
<p>No hay fotos</p>
{% endif %}
</body>
</html>
Admin's URLS:
from django.conf.urls import url, include
from django.contrib import admin
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'',include('colecion.urls')),
]
View's URLS:
from django.conf.urls import url, include
from colecion import views
urlpatterns =[
url(r'^$',views.general),
]
Edit: I already solve the problem!
settings.py
STATIC_URL = '/static/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'ciencia/static')
models.py
foto=models.ImageField()
html
<img src="{% static alfa.foto %}" />
From the docs:
MEDIA_URL - "Absolute filesystem path to the directory that will hold user-uploaded files."
MEDIA_ROOT - "URL that handles the media served from MEDIA_ROOT, used for managing stored files. It must end in a slash if set to a non-empty value. You will need to configure these files to be served in both development and production environments."
Your current config's MEDIA_URL doesn't look right. It should be a URL, you have it set to a filesystem path. Try something like
MEDIA_URL = '/media/'
Add this to urls.py
urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
Change {{a.imagen}} to {{a.imagen.url}}

Django problems with media and image in template

Have a problem, try to do simple gallery in django, but when i tried to check how it looks, picture doesn't show anything only title name and there is at terminal "Error 404 not found". Can't realise what actually is wrong... Please help. thx...
Not Found: /media/images/example.png
[16/Mar/2016 17:59:17] "GET /media/images/example.png HTTP/1.1" 404 2168
models.py
class Album(models.Model):
title = models.CharField("Название альбома", max_length=100)
slug = models.SlugField("Ссылка на альбом", max_length=100, unique=True)
img = models.ImageField("Изображение альбома", upload_to='images',
help_text='Размер изображения 200px на 200px')
created_date = models.DateTimeField(default=timezone.now)
published_date = models.DateTimeField(blank=True, null=True)
class Photo(models.Model):
title = models.CharField("Название фотографии", max_length=100)
album = models.ForeignKey(Album, related_name='Альбом')
img = models.ImageField("Фото", upload_to='images',
help_text='Желательно не большой размер')
urls.py - app
from django.conf.urls import url
from django.conf import settings
from django.conf.urls.static import static
from django.views.generic import ListView, DetailView
from .models import Album, Photo
urlpatterns = [
url(r'^$', ListView.as_view(
model=Album,
context_object_name='my_album',
template_name='gallery/album.html'),
name='gallery'
),
url(r'^(?P<slug>[-\w]+)/$', DetailView.as_view(
model=Album,
context_object_name='photos',
template_name='gallery/photo.html'),
name='photo'
),
]
if settings.DEBUG:
urlpatterns += static(settings.MEDIA_URL,
document_root=settings.MEDIA_ROOT)
urls.py - project
from django.conf.urls import url, include
from django.contrib import admin
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^gallery/', include('gallery.urls')),
]
settings.py
STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, 'static/')
MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media/')
template
{% extends "gallery/base.html" %}
{% load thumbnail %}
{% block title %}My Gallery{% endblock %}
{% block text %}
{% for album in my_album %}
<a href='{{ album.slug }}'>
<img src="{{ album.img.url}}" alt="{{ album.title }}">
<!-- {% thumbnail album.img "200x200" crop="center" as im %}
<img src="{{ im.url }}" alt="{{ im.title }}" width="{{ im.width }}"
height="{{ im.height }}">
{% endthumbnail %} -->
</a>
{% endfor %}
{% endblock %}
ProjectStructure
ProjectFolder/
app/
migrations/
static/
templates/
admin.py
models.py
..
project/
settings.py
urls.py
..
media/
images/
example.png
my_env/
manage.py
if in setting.py i do MEDIA_URL = 'media/images' it will work, but only for album template if you will go to see album photos, there photo won't shows too with the same error... Actually i can't understand and realise how to do access to folder media and just bring any of content placed here what i need. Help me...

Media files fail Django

I have a common problem with medias. I have a model which save an image in the media folder :
class Article(models.Model):
titre = models.CharField(max_length=100)
auteur = models.CharField(max_length=42)
contenu = models.TextField(null=True)
date = models.DateTimeField(auto_now_add=True, auto_now=False, verbose_name="Date")
photo = models.ImageField(upload_to="blog/media/upload/photos/", default="default.jpg")
But in my template when I try to get my picture by this way :
<img class="photo" src="{{ media_url }} {{ article.photo }}">
the {{ media_url }} is blank !
In my settings.py file I tried different configuration (found on this website), actually this is :
STATIC_URL = '/static/'
MEDIA_URL = '/media/'
#MEDIA_URL = 'http://localhost:8000/blog/media/'
#MEDIA_ROOT = '/blog/media/'
MEDIA_ROOT = '/home/remi/perso/django/projets/SiteBlog/blog/media/'
ROOT_PATH = os.path.dirname(__file__)
STATICFILES_DIRS = (
os.path.join(ROOT_PATH, 'static'),
)
It works well for static files but not at all for media files.
I also tried to add in urls.py this :
# urlpatterns += patterns('',
# (r'^media/(?P<path>.*)$', 'django.views.static.serve', {
# 'document_root' : settings.MEDIA_ROOT}))
But with ths I get an "Syntax error".
Sorry to post for a common problem like that but I didn't find any working solution for me !
Thanks !
Rémi.
Fitst change {{ media_url }} with {{ MEDIA_URL }} in your template.
<img class="photo" src="{{ MEDIA_URL }} {{ article.photo }}">
And change urls.py like this:
if settings.DEBUG:
# static files (images, css, javascript, etc.)
urlpatterns += patterns('',
(r'^media/(?P<path>.*)$', 'django.views.static.serve', {
'document_root': settings.MEDIA_ROOT}))

Categories

Resources