Je construis une application assez simple, la recherche, dans mon projet Django qui utilise Django-CMS. (C'est ma première tentative de projet/application.) Son objectif principal est de stocker divers actifs intellectuels (par exemple, un article, un livre, etc. écrit par un chercheur).
Le problème est que lorsque je pointe le navigateur sur/research/j'obtiens une erreur en disant que la table 'research_journal' n'existe pas ("pas de telle table").
J'utilise Djnago 1.6.5 avec une base de données sqlite3.
En regardant python manage.py sql research
, vous obtenez:
BEGIN;
CREATE TABLE "research_researchbase" (
"id" integer NOT NULL PRIMARY KEY,
"pub_date" datetime NOT NULL,
"authors" varchar(200) NOT NULL,
"year" varchar(25) NOT NULL,
"title" varchar(200) NOT NULL,
"subtitle" varchar(200) NOT NULL,
"image_id" integer NOT NULL REFERENCES "filer_image" ("file_ptr_id"),
"link" varchar(200) NOT NULL
)
;
CREATE TABLE "research_journal" (
"researchbase_ptr_id" integer NOT NULL PRIMARY KEY REFERENCES "research_researchbase" ("id"),
"journal" varchar(200) NOT NULL,
"abstract" text NOT NULL,
"citation" varchar(200) NOT NULL
)
;
CREATE TABLE "research_encyclopedia_chapter" (
"researchbase_ptr_id" integer NOT NULL PRIMARY KEY REFERENCES "research_researchbase" ("id"),
"encyclopedia" varchar(200) NOT NULL,
"publisher" varchar(200) NOT NULL,
"summary" varchar(200) NOT NULL
)
;
CREATE TABLE "research_book" (
"researchbase_ptr_id" integer NOT NULL PRIMARY KEY REFERENCES "research_researchbase" ("id"),
"publisher" varchar(200) NOT NULL,
"summary" varchar(200) NOT NULL
)
;
COMMIT;
J'ai exécuté python manage.py migrate research
et j'ai:
/Users/XXX/Documents/repos/sfs/env/lib/python2.7/site-packages/app_data/fields.py:2: DeprecationWarning: Django.utils.simplejson is deprecated; use json instead.
from Django.utils import simplejson as json
Running migrations for research:
- Nothing to migrate.
- Loading initial data for research.
Installed 0 object(s) from 0 fixture(s)
J'ai exécuté python manage.py syncdb
et ai obtenu ce qui suit:
Syncing...
Creating tables ...
Installing custom SQL ...
Installing indexes ...
Installed 0 object(s) from 0 fixture(s)
Synced:
> djangocms_admin_style
> Django.contrib.auth
> Django.contrib.contenttypes
> Django.contrib.sessions
> Django.contrib.admin
> Django.contrib.sites
> Django.contrib.sitemaps
> Django.contrib.staticfiles
> Django.contrib.messages
> mptt
> south
> sekizai
> Django_select2
> hvad
Not synced (use migrations):
- djangocms_text_ckeditor
- cms
- menus
- djangocms_style
- djangocms_column
- djangocms_file
- djangocms_flash
- djangocms_googlemap
- djangocms_inherit
- djangocms_link
- djangocms_picture
- djangocms_teaser
- djangocms_video
- reversion
- polls
- djangocms_polls
- aldryn_blog
- easy_thumbnails
- filer
- taggit
- research
(use ./manage.py migrate to migrate these)
Voici le models.py:
from Django.db import models
from Django.utils import timezone
from filer.fields.image import FilerImageField
import datetime
class ResearchBase(models.Model):
pub_date = models.DateTimeField('date published')
authors = models.CharField(max_length=200)
year = models.CharField(max_length=25)
title = models.CharField(max_length=200)
subtitle = models.CharField(max_length=200, blank=True)
image = FilerImageField()
link = models.CharField(max_length=200, blank=True)
def __unicode__(self):
return self.title
def was_published_recently(self):
return self.pub_date >= timezone.now() - datetime.timedelta(days=1)
class Journal(ResearchBase):
journal = models.CharField(max_length=200)
abstract = models.TextField()
citation = models.CharField(max_length=200)
class Encyclopedia_Chapter(ResearchBase):
encyclopedia = models.CharField(max_length=200)
publisher = models.CharField(max_length=200)
summary = models.CharField(max_length=200)
class Book(ResearchBase):
publisher = models.CharField(max_length=200)
summary = models.CharField(max_length=200)
Voici mon point de vue.
from Django.shortcuts import render, get_object_or_404
from Django.http import HttpResponse, Http404
from Django.template import RequestContext, loader
from research.models import Journal, Encyclopedia_Chapter, Book
def research_index(request):
latest_journal_list = Journal.objects.order_by('-pub_date')[:5]
latest_chapter_list = Encyclopedia_Chapter.objects.order_by('-pub_date')[:5]
context = {
'latest_journal_list': latest_journal_list,
'latest_chapter_list': latest_chapter_list
}
return render(request, 'research/index.html', context)
def journal_detail(request, journal_id):
journal = get_object_or_404(Journal, pk=journal_id)
return render(request, 'research/journal_detail.html', {'journal': journal})
def chapter_detail(request, chapter_id):
chapter = get_object_or_404(Encyclopedia_Chapter, pk=chapter_id)
return render(request, 'research/chapter_detail.html', {'chapter': chapter})
Voici l'url.py de l'application:
from Django.conf.urls import patterns, url
from research import views
urlpatterns = patterns('',
url(r'^$', views.research_index, name='research'),
url(r'^(?P<journal_id>\d+)/$', views.journal_detail, name='journal_detail'),
url(r'^(?P<chapter_id>\d+)/$', views.chapter_detail, name='chapter_detail'),
)
Voici le modèle index.html:
{% extends 'research/base.html' %}
{% block research_content %}
<div class="container">
<div class="row featurette">
<h3 id="research">Peer-reviewed Journal Articles</h3>
{% if latest_journal_list %}
<ul id="research">
{% for journal in latest_journal_list %}
<li id="research">
<img src="{{ journal.image.url }}" id="research">
<h4>{{ journal.journal }}</h4>
<h5>{{ journal.title }}</h5>
<a href="{% url 'research:journal_detail' journal.id %}">Read More</a>
</li>
{% endfor %}
</ul>
{% else %}
<p>No journals are available.</p>
{% endif %}
</div>
<div class="row featurette">
<h3 id="research">Encyclopedia Chapters</h3>
{% if latest_chapter_list %}
<ul id="research">
{% for chapter in latest_chapter_list %}
<li id="research">
<img src="{{ chapter.image.url }}" id="research">
<h4>{{ chapter.journal }}</h4>
<h5>{{ chapter.title }}</h5>
<a href="{% url 'research:chapter_detail' chapter.id %}">Read More</a>
</li>
{% endfor %}
</ul>
{% else %}
<p>No encyclopedia chapters are available.</p>
{% endif %}
</div>
</div>
{% endblock %}
Juste au cas où cela importerait, voici mon cms_app.py:
from cms.app_base import CMSApp
from cms.apphook_pool import apphook_pool
from Django.utils.translation import ugettext_lazy as _
class ResearchApp(CMSApp):
name = _("Research App")
urls = ["research.urls"]
app_name = "research"
apphook_pool.register(ResearchApp)
Pensées? Toute aide serait grandement appréciée.
On dirait qu'il y a eu un problème avec ma migration.
J'ai exécuté ./manage.py schemamigration research --auto
et constaté que de nombreux champs n'avaient pas de valeur par défaut spécifiée.
Donc, j'ai couru ./manage.py schemamigration research --init
suivi de ./manage.py migrate research
Réexécuter le serveur à partir de là a fait l'affaire!
Ce commentaire sur cette page a fonctionné pour moi et quelques autres. Il mérite sa propre réponse:
python manage.py migrate --run-syncdb
Pour Django 1.10, vous devrez peut-être faire python manage.py makemigrations appname
.
J'utilise Django 1.9, SQLite3 et DjangoCMS 3.2 et j'ai le même problème. Je l'ai résolu en exécutant python manage.py makemigrations
. Cela a été suivi d'une invite indiquant que la base de données contenait des types de valeur non null, mais qu'aucune valeur par défaut n'était définie. Cela me donnait deux options: 1) sélectionner une valeur unique maintenant ou 2) quitter et changer le paramètre par défaut dans models.py. J'ai sélectionné la première option et donné la valeur par défaut de 1. Cette opération a été répétée quatre ou cinq fois jusqu'à ce que l'invite indique qu'elle est terminée. J'ai ensuite couru python manage.py migrate
. Maintenant cela fonctionne très bien. N'oubliez pas qu'en exécutant d'abord python manage.py makemigrations
, une copie révisée de la base de données est créée (la mienne date de 0004) et vous pouvez toujours revenir à un état précédent de la base de données.
Le problème peut être résolu en exécutant des migrations.
python manage.py makemigrations
python manage.py migrate
effectuez les opérations ci-dessus chaque fois que vous apportez des modifications dans models.py
.
Cette erreur survient lorsque vous n'avez pas effectué de migration vers la table que vous venez de créer, Ainsi, commencez par écrire la commande sur cmd en tant que: python manage.py makemigrations
, puis écrivez une autre commande pour appliquer ces migrations effectuées par la commande makemigrations: python manage.py migrate
Cela m'est arrivé et pour moi c'est parce que j'ai ajouté db.sqlite3
comme non suivi du référentiel. Je l'ai ajouté et poussé sur le serveur afin que cela fonctionne correctement. Exécutez également makemigartions
et migrate
après avoir exécuté cela.
J'utilise Django CMS 3.4 avec Django 1.8 . J'ai expliqué la cause principale dans le code Django CMS . La cause première est que le Django CMS ne change pas de répertoire dans le répertoire avec le fichier contenant la base de données SQLite3 avant de créer appels de base de données. Le message d'erreur est parasite. Le problème sous-jacent est qu'un appel à la base de données SQLite est effectué dans le mauvais répertoire.
La solution consiste à s'assurer que toutes vos applications Django reviennent dans le répertoire racine du projet Django lorsque vous passez aux répertoires de travail.