Есть такие ошибки, в которых стыдно признаваться. Но мне не очень стыдно - потому что я сам же и исправил свою ошибку, не озвучая свою проблему ни на каком форуме. Правда, на поиск причины ошибки пришось потратить вчерашний вечер и сегодня еще полдня. Именно поэтому я так зол и хочу навсегда - навсегда! - запомнить эту ошибку и никогда уже более на нее не попадаться. Короче, фишка вот в чем. Представьте, что вы хотите прописать у себя на сайте трансляцию RSS или сделать карту сайта, и вам в связи с этим возникает необходимость прописать функцию get_absolute_url(). Получается примерно вот такой код: from django.db import models
from django.contrib import admin
# Create your models here.
class BlogPost(models.Model):
title = models.CharField(max_length=200)
body = models.TextField()
timestamp = models.DateTimeField()
def get_absolute_url(self):
return '/blog/%s/' % str(self.id)
Все идет хорошо, но вот вы запускаете сервер и получаете в терминале такую ошибку:
...
File "/home/chevalry/djcode/nkovcheg/../mysite/blog/models.py", line 11
def get_absolute_url(self):
^
IndentationError: unindent does not match any outer indentation level
Вопрос знатокам - что это за ошибка и что она означает? Если вы сразу назовете правильный ответ, то вам 5+.
Я лично перепробовал кучу вариантов. Ясно, что это ошибка компиляции Python, а не ошибка Django. Также очевидно, что это ошибка связанная с отступом. Я вписал и удалил функцию def get_absolute_utl() раз десять. Ничего не помогает.
Короче, выяснилось, что проблема заключается в вышележащих строках title, body и timestamp. Оказывается, эти три строки я когда-то вписал (когда еще не знал, что так нельзя делать), отступив от начала строки не на 4 положенных пробелах, а на символ табуляции Tab.
Я конечно и рад, что нашел эту ошибку, и зол, что мне пришлось ее искать так долго. Пишу об этом специально: хоть это и мелочь - но видимо из таких мелочей складывается жизнь программиста...
P.S. Должен сказать, что это ошибка не только тупая, но еще и довольно коварная. Коварство ее состоит в том, что с символом Tab модель BlogPost сама по себе прекрасно работает. Но если к ней добавить пару строк нового кода, где применяется не табуляция, а положенные 4 пробела, возникает ошибка. И поди попробуй догадайся, в чем причина. Визуально-то это не видно! Так что вот... P.P.S.
irishterrier порекомендовал одну удобную команду в VIM, которая автоматически преобразует все Tab'ы в пробелы - в соответствии с настройками в ~/.vimrc. Конкретно он дал эту ссылку:
Converting tabs to spaces. В частности, там написано следующее:
After the 'expandtab' option is set, all the new tab characters entered will be changed to spaces. This will not affect the existing tab characters. To change all the existing tab characters to match the current tab settings, use:
:retab
Как раз по теме!