2013-04-15 2 views
0

У меня есть простая модель, и я хочу сохранить ее с помощью ModelForm.django «нет такой таблицы» при использовании ModelForm.save

Вот код:

#models.py 
class MyArchive(models.Model): 
    archive_id = models.CharField(max_length = 20, primary_key=True) 
    description = models.CharField(max_length = 50, blank = True) 
    archive_file = models.FileField(upload_to = "my_archives/") 

#views.py 
class MyArchiveForm(ModelForm): 
    class Meta: 
     model = MyArchive 
def upload(request): 
    if request.method == 'POST': 
     form = MyArchiveForm(request.POST, request.FILES) 
     if form.is_valid(): 
      form.save() 
      return HttpResponse('uploaded success!') 
     else: 
      logger.debug("invalid form") 
    return HttpResponse('upload fail!') 

Я синхронизируются БД и увидел таблицы, созданные. Но каждый раз, когда он идет в form.save, тогда говорит

Является ли способ сохранить с помощью ModelForm неправильно?

UPDATE: Что даже странно, что, когда я удалил эту строку: form.save(), она не в if form.is_valid() с той же ошибкой no such table, но при запуске Джанго в режиме отладки, if form.is_valid() работает отлично.

+0

Вы пытались удалить всю базу данных и запустив 'syncdb' еще раз? Эта команда не распознает изменения в ваших моделях, а только новые! Если вы хотите направить изменения с ваших моделей на свою базу данных, попробуйте South. – Caumons

+0

@Caumons Да, я пробовал, но он все еще не работает. Фактически, даже я удаляю 'form.save()', он терпит неудачу в 'if form.is_valid():', но он работает до того, как я что-то изменил, не мог вспомнить. – ThemeZ

+0

Что не получается с 'form.is_valid()'? – Caumons

ответ

0

Это небольшой трюк, получается во главе с плохой конфигурацией базы данных. Я использовал относительный путь в settings.py, поэтому он не нашел файл db во время работы, но при запуске django sycdb он может найти, где db loc.

'default' : { 
    'ENGINE': 'django.db.backends.sqlite3', # Add 'postgresql_psycopg2', 'mysql', 'sqlite3' or 'oracle'. 
    'NAME': 'sqlite.db',      # Or path to database file if using sqlite3. 
} 

UPDATE: Чтобы использовать относительный путь на файл базы данных, я должен иметь дб настройки, как это:

from os.path import dirname, join 

PROJECT_DIR = dirname(__file__) 

DATABASES = { 
    # ... 
    'NAME': join(PROJECT_DIR, 'sqlite.db'), 
    # ... 
} 

см Can I make the Django database path (for sqlite3) "cross-platform"?

Смежные вопросы