вторник, 27 сентября 2011 г.

Django: "Accessor for field... clashes with related field" error after syncdb


If you see error message
Accessor for field ... clashes with related field
after syncdb command then likely problem in that one of your tables reffers another tables by 2 (or more) of its fields..

Example:


class User(models.Model):
     name = models.TextField()
     birth_date = models.DateTimeField()

class Message(models.Model):
     from = models.ForeignKey(User)
     to = models.ForeignKey(User)
     text = models.TextField()
#table 'Messages' has two links to table 'User'

Django could resolve this issue by defaulf by adding incremental postfix to accessor names for example.. But I have never hear about such django feature :)

To cut a long story short.. problem is solved by adding extra attributes for every referencing field:


class User(models.Model):
     name = models.TextField()
     birth_date = models.DateTimeField()

class Message(models.Model):
     from = models.ForeignKey(User,related_name="message_sender")
     to = models.ForeignKey(User,related_name="message_reciever")
     text = models.TextField()

syncdb shouldnt show accessor errors after that..

Django: ошибка "Accessor for field ... clashes with related field"


Если в результате syncdb вашей django-схемы вы видите сообщение :
Accessor for field ... clashes with related field
то скорее всего дело в том, что одна из ваших таблиц двумя своими полями ссылается на другую таблицу схемы.

Пример:


class User(models.Model):
     name = models.TextField()
     birth_date = models.DateTimeField()

class Message(models.Model):
     from = models.ForeignKey(User)
     to = models.ForeignKey(User)
     text = models.TextField()
#то есть таблица Сообщение имеет два внешних ключа на таблицу Пользователь

По идее django могла бы разруливать такую сиутацию, добавляя к имени аксессора какой-нибудь уникальный индекс (например, простой инкремент). Но о такой возможности фреймворка лично я не знаю..

Проблема же решается дополнительным атрибутом для ссылающихся полей:



class User(models.Model):
     name = models.TextField()
     birth_date = models.DateTimeField()

class Message(models.Model):
     from = models.ForeignKey(User,related_name="message_sender")
     to = models.ForeignKey(User,related_name="message_reciever")
     text = models.TextField()

После этого syncdb должно выполниться без проблем (только, конечно, нет других ошибок =)

четверг, 15 сентября 2011 г.

highlight.js в blogspot-дневниках


Решил сообщения своего блога сделать более наглядными добавив подсветку фрагментов кода.
Перебрав несколько вариантов реализаций , остановился на highlight.js.
Поддерживает кучу языков программирования и даже специально некоторые фреймворки. Например Django.
Легко подключается, особенно, если ваш блог располагается на сервере, к которому есть полный доступ.
Для того чтобы подключить подсветку к blogger тоже не надо особо извращаться:

1. Перейти в html настройки текущего используемого шаблона
2. в секции <head> подключить js-исходники, которые, к слову, хостятся в том числе и на yandex и могут быть подключены прямо оттуда...
3. в той же секции <head> подключить нужную CSS (существует несколько вариантов тем, демки которых доступны на сайте разработчика)
4. в пределах <body> ( либо в исходном коде поста, либо , опять же, в каркасе шаблона ) инициализировать эту подключенную библиотеку
5. оформить код, требующий подсветки в теги <pre> и <code> , указав нужный язык в аттрибуте class

Вот собственно и все.

Примерно так это должно быть:

<pre><code class="html">
<head>
<link href='http://yandex.st/highlightjs/6.0/styles/vs.min.css' rel='stylesheet'/> 
<script src='http://yandex.st/highlightjs/6.0/highlight.min.js'></script>
</head>
<body>
<script>hljs.initHighlightingOnLoad();</script>
</body>
</code>
</pre>

Ну и без примера никуда. Вот, пожалуйста, для Си:


#include 'stdlib.h';
int main(){
   /*any comments*/
   printf("%s","Hello World!");
   return 0;
}

django: Работаем с параметрами HTTP-запроса в шаблонах


Часто возникает необходимость узнать, к примеру, текущий URL при отрисовке шаблона. Например, простейшая вещь - добавить на те или иные страницы сайта Facebook-овский лайк. Разработчики этой соц.сети предлагают нам следующий код для вставки:



Как видим, url статично. Вставляем код в шаблон и вместо url подставляем {{request.get_full_path}}. Отображаем обновленную страницу - результата пока нет. Дело в том, что мы забыли добавить в settings.py request-препроцессор контекста.
 
TEMPLATE_CONTEXT_PROCESSORS = ( 
#здесь перечислены какие-то другие процессоры     
'django.core.context_processors.request', 
#здесь перечислены какие-то другие процессоры 
) 
 

После этого при отображении страницы с вставленным кодом будет отображаться фейсбуковская лайк-кнопка. Отмечу, что в приведенном примере используется функция get_full_path, которая возвращает относительный url со всеми GET-параметрами запроса. Есть еще функция path - возвращает относительный url без имени домена и без GET-параметров . Узнать имя хоста / домен позволяет функция get_host. Таким образом, для получения полного абсолютного URL страницы в шаблоне необходимо добавить код:
  {{request.get_host}} {{request.get_full_path}} 

специально указывать слеш после хоста не нужно, так как *path - функции возвращают url уже с лидирующим слешем.


int main(){
 printf("%s","Hello world");
}