Форум сайта python.su
Изучаю Django 1.0.2 по Djangobook
Прочитал еще не все, но почему то нигде не могу в этой книге найти информацию, как быть с изображениями? В книге приводится пример с тремя моделями - Авторы, Издатели и Книги. А если я хочу еще добвить изображения к книжкам и чтобы они выводились в шаблонах в одинаковых размерах???
Подскажите, плиз, где найти такую информацию
Вот мой код:
booksite/books/models.py
# -*- coding: utf-8 -*-
from django.db import models
class Publisher(models.Model):
name = models.CharField(max_length=30)
address = models.CharField(max_length=50)
city = models.CharField(max_length=60)
state_province = models.CharField(max_length=30)
country = models.CharField(max_length=50)
website = models.URLField()
def __unicode__(self):
return self.name
class Meta:
ordering = ['-name']
class Author(models.Model):
first_name = models.CharField(max_length=30)
last_name = models.CharField(max_length=40)
email = models.EmailField(blank=True, verbose_name='почта')
def __unicode__(self):
return u'%s %s' % (self.first_name, self.last_name)
class Book(models.Model):
title = models.CharField(max_length=100)
authors = models.ManyToManyField(Author) # связь с данными из таблицы Author
publisher = models.ForeignKey(Publisher) # Внешний ключ к таблице Publisher
publication_date = models.DateField(blank=True, null=True)
def __unicode__(self):
return self.title
# -*- coding: utf-8 -*-
from django.http import HttpResponse
from django.shortcuts import render_to_response
from booksite.books.models import Publisher, Author, Book
def publisher(request):
pub = Publisher.objects.all()
return render_to_response('pub.html', {'pub': pub})
def archive(request):
bk = Book.objects.filter(title__contains="Dj")
return render_to_response('archive.html', {'bk': bk})
def index(request):
return render_to_response('index.html')
{% extends "base.html" %}
{% block title %}Книги{% endblock %}
{% block banner %}{% endblock %}
{% block content %}
{% for x in pub %}
<h1>{{ x.name }}</h1>
<p>{{ x.address }}</p>
<p>{{ x.website }}</p>
<hr/>
{% endfor %}
{% endblock %}
Отредактировано (Июнь 20, 2009 14:08:06)
Офлайн
За изображение отвечает поле ImageField (дла работы должна быть установлена PIL — http://www.pythonware.com/products/pil/).
Считать высоту и ширину картинки (в т.ч. и из шаблона) можно как image.width и image.height. А вот подгонять все изображения к одному размеру уже сложнее. Первое что приходить в голову — создать отдельную функцию и подключить к модели через сигнал post_save (вот так:)
# models.py
from django.db.models.signals import post_save
#... описание моделей ...
def resize(sender, *args, **kwargs):
# Экземпляр модели передается как kwargs['instance'].
# Тут должен быть код, уменьшающий картинку до нужного размера :-)
# Как его написать посмотрите в документации к PIL (ссылка выше), там всего несколько строчек.
pass
post_save.connect(resize, sender=Book)
Офлайн
Спасибо! Буду пытаться дальше!
Офлайн
Ребята, может кто-нибудь подскажет подробнее о том, как в Джанго выводить изображение на страницу. В djangobook об этом как-то вскользь описано. У меня выводится на страницу описания книг, а добавить картинки к этим описанием не получается.
Может быть есть какие-нибудь более подробные туториалы или решения на эту тему?
Офлайн
У поля ImageField есть метод url. В шаблоне нужно написать что-то вроде:
<img src='{{ object.image.url }}'>
Офлайн
Tardos Mors, спасибо за помощь, но я все еще не могу сделать, что хочу (хотя уже очень рядом!). Подскажите, в чем у меня ошибка. Выводится просто место под картинку, а не сама картинка
settings.py
MEDIA_ROOT = 'C:/booksite/media/'
MEDIA_URL = 'http://booksite/media/'
class Article(models.Model):
title = models.CharField(max_length=200)
anonce = models.TextField()
body = models.TextField()
url = models.URLField(unique=True)
date = models.DateTimeField()
image = models.ImageField(upload_to='media/')
def art(request):
art = Article.objects.all()
return render_to_response('art.html', {'art': art})
urlpatterns = patterns('',
('^$', index),
(r'^books/$', archive),
(r'^pub/$', publisher),
(r'^article/$', art),
(r'^admin/(.*)', admin.site.root),
{% for art in art %}
<h1>{{ art.title }}</h1>
<h3>{{art.anonce }}</h3>
<img src='{{art.image}}'>
<hr/>
{% endfor %}
Отредактировано (Июнь 21, 2009 12:53:51)
Офлайн
В шаблоне art.image.url нужно добавить
Офлайн
sv0не помогло.
В шаблоне art.image.url нужно добавить
Офлайн
Попробуйту в shell посмотреть, что скажет:
./manage.py shell
>>> from your_app.models import Article
>>> Article.objects.all()[0].image.url
Офлайн
sv0вывело u'http://127.0.0.1:8000/media/media/5.jpg'
Попробуйту в shell посмотреть, что скажет:где your_app - имя вашего приложенния../manage.py shell
>>> from your_app.models import Article
>>> Article.objects.all()[0].image.url
в примере должно вывести URL изображения из первой статьи.
Офлайн