03.03.2012
Часто бывает нужно организовать новости, блог, какие-то статьи. Для этого обычно используют небольшой вступительный текст и ссылку “Читать далее”.
Если вы используете HTML-тэги в своих статьях, то заметите, что Django не закрывает их при использовании фильтра truncatewords.
Пример реализации
Если вы хотите запретить HTML-тэги только в этом вступительном тексте, а также картинки, видео и прочее, то можно пойти следующим путем. В необходимом файле шаблона, в требуемой переменной примените фильтр striptags, затем truncatewords, затем safe (для правильной обработки HTML-символов):
{{ news.description|striptags|truncatewords:"30"|safe }}
Получится, например, такой текст - “Как все мы помним, после The International все датские игроки из MYM покинули эту организацию и им на замену была взята команда Scythe.SG. Вчера стало известно, что состав снова претерпел серьезные …”. Протестировано на Django 1.3.
Также, если у вас пробелы представлены в виде
, то приведенный выше метод может не работать. Для решения проблемы используйте фильтр truncatewords_html
. Таким образом, код будет вида:
{{ news.description|truncatewords_html:"30"|safe }}
Как видите, мы еще убрали фильтр striptags.
django
02.03.2012
Django при сохранении файла через админку или форму сохраняет название файла. Например, при загрузке картинки "mypic.jpg"
она сохранится с этим названием.
Также, если загружаемый файл на русском языке, то его имя будет сохранено - “моя_картинка.jpg”. Вы можете изменить этот механизм.
ПРИМЕЧАНИЕ. Последующие загружаемые файлы с таким названием будут иметь префикс "_"
, т.е. "_mypic.jpg"
, "__mypic.jpg"
и т.п.
Пример реализации
Этот код должен быть помещен в файл models.py нужного вам приложения.
import os, uuid
def get_file_path(instance, filename):
ext = filename.split('.')[-1]
filename = "%s.%s" % (uuid.uuid4(), ext)
return os.path.join(instance.directory_string_var, filename)
class MyModelFiles(models.Model):
myimage = models.FileField(upload_to = get_file_path)
directory_string_var = 'my-path-to-files-for-this-model'
class MyModelImages(models.Model):
myimage = models.ImageField(upload_to = get_file_path)
directory_string_var = 'my-path-to-images-for-this-model'
Таким образом, при следующей загрузке файла его имя будет выглядеть, например, так «384408e1-5465-46fd-bf47-61f913fa78e5.jpg»
.
Протестировано на версии Django 1.3.
django
02.03.2012
Получаем список всех имен столбцов модели
model_field_names = model._meta.get_all_field_names()
Получаем название модели
model_name = model._meta.getattr()
django
01.03.2012
Для успешного парсинга страниц достаточно двух инструментов - urllib и BeautifulSoup. Первый обычно доступен сразу после установки python, второй легко можно найти в интернете - http://www.crummy.com/software/BeautifulSoup/bs3/download/
Пример
>>> from BeautifulSoup import BeautifulSoup
>>> import urllib
>>> f = urllib.urlopen('http://my.site') # Открываем сайт, который будем парсить
>>> soup = BeautifulSoup(f.read()) # Считываем его и одновременно закидываем в BeautifulSoup
>>> my = soup.findAll(name='div', attrs={'class': 'news'}) # Ищем все div`ы с классом 'news'
>>> for m in my:
... print m # Выводим их
Результат, например, может быть следующий (если найден только один div):
[u'Содержание статьи 1.']
По шагам
<span>1</span>. Качаем BeautifulSoup.tar.gz
, который лежит в корне.
<span>2</span>. Распаковываем gz, затем tar.
<span>3</span>. Копируем в папку (желательно без русских символов и пробелов).
<span>4</span>. Устанавливаем:
Нажимаем Ctrl+R
cmd
cd C:\BeautifulSoup-3.2.1
python setup.py install
<span>5</span>. Должно успешно установиться. Теперь можем испытать скрипт. Заходим в python:
>>> from BeautifulSoup import BeautifulSoup
>>> import urllib
>>> f = urllib.urlopen('http://my.site') # Открываем сайт, который будем парсить
>>> soup = BeautifulSoup(f.read()) # Считываем его и одновременно закидываем в BeautifulSoup
>>> my = soup.findAll(name='div', attrs={'class': 'news'}) # Ищем все div`ы с классом 'news'
>>> for m in my:
... print m.findAll(text=True) # Выводим их
<span>6</span>. В результате должны были получить содержимое всех div c классом news
.
django
24.11.2011
Как известно, джанго при загрузке файла сохраняет его имя. Т.е. в имени файла вполне могут быть русские буквы - мы от этого не защищены. Я считаю, что лучше организовать изображения на сайте по хэшам или uuid. Это делается довольно просто, благодаря тому, что в джанго путь к картинке и имя файла можно генерировать функцией.
Давайте посмотрим, как это сделать.
import os, uuid
def get_file_path(instance, filename):
ext = filename.split('.')[-1]
filename = "%s.%s" % (uuid.uuid4(), ext)
return os.path.join(instance.directory_string_var, filename)
class MyModel(models.Model):
myimage = models.FileField(upload_to = get_file_path)
directory_string_var = 'my-path-to-images-for-this-model'
Таким образом, при следующей загрузке файла его имя будет выглядеть, например, так “384408e1-5465-46fd-bf47-61f913fa78e5.jpg”.
Встретился с данным решением на интересном англоязычном ресурсе stackoverflow.
django