<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Code-Is-Art &#187; Django</title>
	<atom:link href="http://www.codeisart.ru/rubric/python/django-python/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.codeisart.ru</link>
	<description>Статьи по SEO, дизайну и программированию. Переводы на веб-тематику. Исследования и наработки в области интернет-технологий.</description>
	<lastBuildDate>Tue, 08 Nov 2011 13:43:11 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Сравнение значений в шаблонах Django</title>
		<link>http://www.codeisart.ru/comparison-of-values-in-django-templates/</link>
		<comments>http://www.codeisart.ru/comparison-of-values-in-django-templates/#comments</comments>
		<pubDate>Fri, 15 May 2009 09:57:49 +0000</pubDate>
		<dc:creator>Skaizer</dc:creator>
				<category><![CDATA[Django]]></category>
		<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://www.codeisart.ru/?p=1493</guid>
		<description><![CDATA[Недавно столкнулся с&#160;проблемой, связанной с&#160;ограниченностью шаблонного языка Django, а&#160;именно невозможностью сравнить два значения между собой (больше, меньше и&#160;т.д.). Варианты вроде: {% if some_val > 4 %} &#60;p&#62;Истина&#60;/p&#62; {% else %} &#60;p&#62;Ложь&#60;/p&#62; {% endif %} вызывают ошибку. В&#160;поисках решения я&#160;нагуглил библиотеку, разработанную Джеймсом Беннеттом (James Bennett)&#160;&#8212;&#160;django-template-utils. Для использования достаточно добавить библиотеку в&#160;Python окружение, можно посредством установки: [...]]]></description>
			<content:encoded><![CDATA[<p>Недавно столкнулся с&nbsp;проблемой, связанной с&nbsp;ограниченностью шаблонного языка Django, а&nbsp;именно невозможностью сравнить два значения между собой (больше, меньше и&nbsp;т.д.). Варианты вроде:</p>
<pre><code class="html">{% if some_val > 4 %}
&lt;p&gt;Истина&lt;/p&gt;
{% else %}
&lt;p&gt;Ложь&lt;/p&gt;
{% endif %}</code></pre>
<p>вызывают ошибку.</p>
<p>В&nbsp;поисках решения я&nbsp;нагуглил библиотеку, разработанную Джеймсом Беннеттом (James Bennett)&nbsp;&mdash;&nbsp;<a href="http://django-template-utils.googlecode.com/">django-template-utils</a>.</p>
<p><span id="more-1493"></span></p>
<p>Для использования достаточно добавить библиотеку в&nbsp;Python окружение, можно посредством установки:</p>
<pre><code class="bash">tar zxvf template_utils-0.4p2.tar.gz
cd&nbsp;template_utils-0.4p2
python setup.py install
</code></pre>
<p>А&nbsp;можно просто добавить приложение в&nbsp;<code>INSTALLED_APPS</code> проекта.</p>
<p>В&nbsp;результате вам будут доступны функции сравнения значений, и&nbsp;другие полезные возможности в&nbsp;шаблонах Django.</p>
<p>Например проверка значения на&nbsp;условие &laquo;<i>меньше или равно 4х</i>&raquo;:</p>
<pre><code class="html">{% load comparison %}
{% if_less_or_equal some_val 4 %}
&lt;p&gt;Истина&lt;/p&gt;
{% else %}
&lt;p&gt;Ложь&lt;/p&gt;
{% endif_less_or_equal %}</code></pre>
<p>Ссылка на&nbsp;библиотеку: <a href="http://django-template-utils.googlecode.com/">django-template-utils.googlecode.com</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.codeisart.ru/comparison-of-values-in-django-templates/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Python, Django: Автоматический ресайз загружаемых изображений</title>
		<link>http://www.codeisart.ru/python-django-automatically-resize-uploaded-images/</link>
		<comments>http://www.codeisart.ru/python-django-automatically-resize-uploaded-images/#comments</comments>
		<pubDate>Tue, 28 Apr 2009 21:46:57 +0000</pubDate>
		<dc:creator>Skaizer</dc:creator>
				<category><![CDATA[Django]]></category>
		<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://www.codeisart.ru/?p=1476</guid>
		<description><![CDATA[На&#160;данный момент мы&#160;занимаемся разработкой городской социальной сети. Не&#160;&#171;убийцы&#187; Вконтакте и&#160;Одноклассников, ее&#160;задачи будут в&#160;корне иными. В&#160;качестве программной основы был выбран Django, написанный на&#160;языке Python. Разрабатывая интерфейс управления личной информацией необходимо было решить задачу: при загрузке пользователем собственной фотографии, ее&#160;размер должен быть не&#160;более некоторых значений, определенных настройками системы, если фото больше, то&#160;необходимо произвести ресайз с&#160;сохранением пропорций. В&#160;этой [...]]]></description>
			<content:encoded><![CDATA[<p>На&nbsp;данный момент мы&nbsp;занимаемся разработкой городской социальной сети. Не&nbsp;&laquo;убийцы&raquo; Вконтакте и&nbsp;Одноклассников, ее&nbsp;задачи будут в&nbsp;корне иными. В&nbsp;качестве программной основы был выбран Django, написанный на&nbsp;языке Python.</p>
<p>Разрабатывая интерфейс управления личной информацией необходимо было решить задачу: при загрузке пользователем собственной фотографии, ее&nbsp;размер должен быть не&nbsp;более некоторых значений, определенных настройками системы, если фото больше, то&nbsp;необходимо произвести ресайз с&nbsp;сохранением пропорций.</p>
<p>В&nbsp;этой статья я&nbsp;представлю наше решение поставленной задачи. Возможно, оно окажется не&nbsp;оптимальным, поэтому с&nbsp;удовольствием выслушаю ваши комментарии!</p>
<p><span id="more-1476"></span></p>
<h3>Django, ресайз изображений</h3>
<p>Функция ресайза изображения. Автоматически изменяет размер, сохраняя пропорции:</p>
<pre><code class="python">def imageResize(data, output_size):
  &quot;&quot;&quot;
  Resize image for thumbnails and preview
  data&nbsp;&mdash;&nbsp;image for resize
  output_size&nbsp;&mdash;&nbsp;turple, contains width and height of&nbsp;output image, for example (200, 500)
  &quot;&quot;&quot;

  from PIL import Image

  image = Image.open(data)
  m_width = float(output_size[0])
  m_height = float(output_size[1])
  if&nbsp;image.mode not in&nbsp;('L', 'RGB'):
    image = image.convert('RGB')
  w_k = image.size[0]/m_width
  h_k = image.size[1]/m_height
  if&nbsp;output_size < image.size:
    if w_k > h_k:
      new_size = (m_width, image.size[1]/w_k)
    else:
      new_size = (image.size[0]/h_k, m_height)
  else:
    new_size = image.size
  return image.resize(new_size,Image.ANTIALIAS)</code></pre>
<p>Например, при максимально возможных размерах изображения <i>200&times;500&nbsp;px</i>,&nbsp;загружая изображения на&nbsp;<i>1024&times;768&nbsp;px</i>,&nbsp;новые изображения будут&nbsp;&mdash;&nbsp;<i>200&times;150&nbsp;px</i>.</p>
<p>Далее перекрываем стандартный джанговский <code class="python">models.ImageField</code>, расширяя метод <code class="python">save_form_data</code>, в&nbsp;котором и&nbsp;будем производить ресайз:</p>
<pre><code class="python">class AvatarImageField(models.ImageField):
  def save_form_data(self, instance, data):
    from StringIO import StringIO
    from django.core.files.uploadedfile import SimpleUploadedFile, UploadedFile

    if&nbsp;data and isinstance(data, UploadedFile):
      image = imageResize(data, settings.AVATAR_SIZE)
      new_image = StringIO()
      image.save(new_image, 'JPEG', quality=85)
      data = SimpleUploadedFile(data.name, new_image.getvalue(), data.content_type)

      # Удаление старого файла
      previous = u'%s%s' % (settings.MEDIA_ROOT, instance.avatar)
      if&nbsp;os.path.isfile(previous):
        os.remove(previous)
      # -
    super(AvatarImageField, self).save_form_data(instance, data)</code></pre>
<p>Определяем функцию, которая будет возвращать путь к&nbsp;директории сохранения файла, а&nbsp;так&nbsp;же имя файла. Она будет возвращать нужный путь для <code class="python">upload_to</code> файлового поля.  В&nbsp;нашем случае имя файла генерируется некоторой хэш-функцией:</p>
<pre><code class="python">  def make_upload_path(instance, filename, prefix = False):
    # Переопределение имени загружаемого файла.
    from utils.hashfunc import get_hash

    filename = 'a_' + get_hash('md5') + '.jpg'
    return u&quot;%s/%s&quot; % (settings.AVATAR_UPLOAD_DIR, filename)</code></pre>
<p>И,&nbsp;собственно, сама модель данных, поле <code class="python">avatar</code> определяется нашим перекрытым классом <code class="python">AvatarImageField</code>, следовательно, наследует всю его функциональность:</p>
<pre><code class="python">class Avatars(models.Model):
  user = models.ForeignKey(User, unique=True)
  avatar = AvatarImageField(
    upload_to=make_upload_path,
    null = False,
    blank = False,
    )</code></pre>
<p>Готово. Теперь все загружаемые изображение, превышающие определенные в&nbsp;системе размеры будут ресайзиться, сохраняя пропорции.</p>
<p><b>С удовольствием готов ответить на вопросы, а так же выслушать конструктивную критику этого метода!</b></p>
<h3>Говорим спасибо</h3>
<p>Выражаю благодарность <a href="http://softwaremaniacs.org/about/">Ивану Сагалаеву</a> за&nbsp;его ресурс о&nbsp;программировании в&nbsp;целом и&nbsp;в&nbsp;частности на&nbsp;Python. На&nbsp;этапе ознакомления с&nbsp;Django почти с&nbsp;не&nbsp;покидали его страницы.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.codeisart.ru/python-django-automatically-resize-uploaded-images/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
	</channel>
</rss>

<!-- Performance optimized by W3 Total Cache. Learn more: http://www.w3-edge.com/wordpress-plugins/

Served from: www.codeisart.ru @ 2012-02-04 09:45:37 -->
