C'est avec grand intérêt que je veux me lancer dans django mais je suis depuis une semaine bloqué à l'installation!
Etant sur mac j'ai suivi à la lettre vos indications, réussi à installer django via pip mais impossible de faire reconnaitre django par python. Il me renvoie "ImportError: No module named 'django'" à toutes tentatives. J'ai tout essayé, recommencé, regardé des centaines de tutoriels, impossible de me sortir de cette mauvaise passe!
Toujours en suivant le nouveau cours, j'ai crue bien comprendre les instructions, cependant, il y à des points ambigues tel que lorsqu'il est mentionné de:
"Nous commençons par un exemple avec une vue qui renvoie juste la date actuelle à l'utilisateur, et son fichier urls.py associé :"
J'ai mit le code demandé dans ~/Documents/Projets/crepes_bretonnes/blog/views.py :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
fromdjango.http importHttpResponse
fromdjango.shortcuts importrender
fromdatetime importdatetime
defhome(request):
""" Exemple de page HTML, non valide pour que l'exempe soit concis """
text ="""<h1> Bienvenue sur mon blog !</h1>
<p>Les crêpes bretones ça tue des mouettes en plein vol !</p>"""
ton erreur est là : http://localhost:8000/blog/date.html
ici tu pointes un fichier statique ( html ), il faut garder en tête que l'url n'est qu'une "route" qui sera analysé par Django ( et matché avec ton/tes fichiers urls.py ) pour exécuter la bonne vue .
Désolé de faire du déterrage de topic, j'ai exactement le même problème que Mobidoy et j'ai suivi le tuto à la lettre, je ne vois pas l'erreur que j'ai commise, car le fait de taper "l'url", donc la route ne change rien:
Avez-vous une ligne avec url(r'^blog/',...) dans le urls.py du projet principal ("crepes_bretonnes", je suppose) dans laquelle l'application blog est placée?
Alors voilà moi, je cale vraiment sur un problème très simple : j'aimerais afficher des images sur mon site.
Alors pourquoi c'est un mystère? Parce que le chargement d'image se réalise sans le moindre problème lorsque je la charge dans une appli. Mais ce que j'aimerais, c'est placer les images dans la page d'accueil et donc dans le dossier /mon_projet/static/images/mon_image.png
Le plus bizarre c'est que pour charger des images dans le fichier mon_projet/static/css/base.css, il n'y a aucun problème. J'ai essayé d'indiqué l'url relatif et puis l'url absolu pour le chemin de l'image mais rien n'y fait :calim2:
Ce qui me frustre beaucoup c'est que la grosse majorité des tutoriels expliquent le cas de figure pour les applis mais pas pour les pages de "base".
voici une ligne de code pour le fichier css, qui lui fonctionne très bien ;
background: #fff url('/../images/headerimg.jpg') no-repeat left top;
Alors évidemment j'ai essayé de jouer avec le chemin du lien donc à priori ce n'est pas le problème bien que si je tape l'adresse [url]http://127.0.0.1:8000/static/images/mon_image.png[/url], il l'affiche bel et bien. J'ai également joué avec la balise {% static 'chemin_de_mon_image' %} mais ça n'a pas donné plus de résultat.
Vous pourriez me demander la structure du projet, il est tout ce qu'il y a de plus django-compliant :
J'en suis à la partie "gestion des fichiers" du cours, et je n'arrive pas à reproduire l'exemple du cours. Je ne crois pas que la question ait été abordée plus haut, pardon si c'est le cas !
J'ai 2 soucis :
- Dans la vue "nouveau-contact", quand j'utilise "sauvegarde = True", rien n'est enregistré en base de donnée. En revanche, c'est le cas si j'utilise form.save()
- Je ne peux pas enregistrer de fichiers sur mon disque, j'ai l'erreur
Pour le problème de sauvegarde, il se peut que le formulaire ne soit pas valide pour une raison X ou Y. Vous pouvez voir les erreurs en utilisant {{ forms.errors }} dans le template.
Pour le problème d'écriture, j'ai l'impression que votre variable MEDIA_ROOT est mal configurée :
# Ce que vous avez surement, qui essaye d'écrire à la racine de votre système de fichiers
MEDIA_ROOT = '/media'
# Ce qui serait mieux
MEDIA_ROOT = os.path.join(BASE_DIR, 'media/')
BASE_DIR est censé être défini tout en haut du fichier settings.py, comme on l'a vu dans la première partie.
Mais pourquoi ça n'est pas généré d'office par la cmd "makemigrations" ?
Que faudrait-il que je fasse ou que je configure ? (Note : Je n'ai pourtant pas eu ce soucis avec la ForeignKey "categorie" pour Article. En quoi c'est différent ici ? )
Non mais il y a bien un ('related_art', models.ForeignKey(to='blog.Article')), dans le CreateModel correspondant, donc ça devrait être correct.
J'avoue ne pas trop comprendre pour le coup pourquoi le champ n'apparait pas... Il se peut qu'il y ait eu un soucis soit avec votre SGBD ou avec Django, mais je préfère n'avancer rien du tout. En développement, où il y a aucune données importantes dans la base, on peut se permettre d'essayer d'annuler la migration puis de la repasser :
python manage.py migrate blog zero # annule toutes les migrations, puisque je suppose que celle-ci est la première
python manage.py migrate blog
Ceci devrait supprimer les tables et les recréer correctement.
Merci pour la piste Ssx`z. Voici ce que ça me génère comme erreur dans la console :
PS C:\learning\python\django\crepes> py manage.py migrate blog zero
Operations to perform:
Unapply all migrations: blog
Running migrations:
No migrations to apply.
PS C:\learning\python\django\crepes> py manage.py migrate blog
Operations to perform:
Apply all migrations: blog
Running migrations:
Rendering model states... DONE
Applying blog.0001_initial...Traceback (most recent call last):
File "C:\Python34\lib\site-packages\django\db\backends\utils.py", line 62, in execute
return self.cursor.execute(sql)
File "C:\Python34\lib\site-packages\django\db\backends\sqlite3\base.py", line 316, in execute
return Database.Cursor.execute(self, query)
sqlite3.OperationalError: table "blog_article" already exists
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "manage.py", line 10, in <module>
execute_from_command_line(sys.argv)
File "C:\Python34\lib\site-packages\django\core\management\__init__.py", line 338, in execute_from_command_line
utility.execute()
File "C:\Python34\lib\site-packages\django\core\management\__init__.py", line 330, in execute
self.fetch_command(subcommand).run_from_argv(self.argv)
File "C:\Python34\lib\site-packages\django\core\management\base.py", line 390, in run_from_argv
self.execute(*args, **cmd_options)
File "C:\Python34\lib\site-packages\django\core\management\base.py", line 441, in execute
output = self.handle(*args, **options)
File "C:\Python34\lib\site-packages\django\core\management\commands\migrate.py", line 221, in handle
executor.migrate(targets, plan, fake=fake, fake_initial=fake_initial)
File "C:\Python34\lib\site-packages\django\db\migrations\executor.py", line 110, in migrate
self.apply_migration(states[migration], migration, fake=fake, fake_initial=fake_initial)
File "C:\Python34\lib\site-packages\django\db\migrations\executor.py", line 147, in apply_migration
state = migration.apply(state, schema_editor)
File "C:\Python34\lib\site-packages\django\db\migrations\migration.py", line 115, in apply
operation.database_forwards(self.app_label, schema_editor, old_state, project_state)
File "C:\Python34\lib\site-packages\django\db\migrations\operations\models.py", line 59, in database_forwards
schema_editor.create_model(model)
File "C:\Python34\lib\site-packages\django\db\backends\base\schema.py", line 286, in create_model
self.execute(sql, params or None)
File "C:\Python34\lib\site-packages\django\db\backends\base\schema.py", line 111, in execute
cursor.execute(sql, params)
File "C:\Python34\lib\site-packages\django\db\backends\utils.py", line 79, in execute
return super(CursorDebugWrapper, self).execute(sql, params)
File "C:\Python34\lib\site-packages\django\db\backends\utils.py", line 64, in execute
return self.cursor.execute(sql, params)
File "C:\Python34\lib\site-packages\django\db\utils.py", line 97, in __exit__
six.reraise(dj_exc_type, dj_exc_value, traceback)
File "C:\Python34\lib\site-packages\django\utils\six.py", line 658, in reraise
raise value.with_traceback(tb)
File "C:\Python34\lib\site-packages\django\db\backends\utils.py", line 62, in execute
return self.cursor.execute(sql)
File "C:\Python34\lib\site-packages\django\db\backends\sqlite3\base.py", line 316, in execute
return Database.Cursor.execute(self, query)
Pour ce qui est d'un problème au niveau SGBD et Django, j'utilise l'installation de base (v 1.8.3). Donc à priori pas de soucis.
Je sais toujours pas d'où ça vient... Personne d'autre n'a ce problème ?
Bon je ne sais pas exactement comment j'ai fait mais le problème est résolu.
J'ai d'abord nettoyé mes migrations :
# python manage.py migrate blog zero
Ensuite j'ai recréé mes migrations :
# python manage.py makemigrations blog
J'ai essayé une énième fois de les appliquer :
# python manage.py migrate blog
Mais ça m'a retourné une erreur "Table ___ already exists". J'ai essayé ça :
# python manage.py migrate --fake blog
Ensuite j'ai relancé le serveur (pas sûr que ça soit utile, mais dans le doute ^^). Et j'ai refait ma migration qui s'est faite sans problème cette fois :
# python manage.py migrate blog
Il semble que ça soit une nouveauté de Django 1.8 : avant il appliquait automatiquement une "fausse" migration si les tables existaient déjà dans la migration initiale (d'après ce que j'en ai compris...)... maintenant il semble que ça coince si lors de la migration des tables existent déjà...
Après avoir lu la partie sur les signaux/middlewares, je me suis à nouveau attelé à l'exercice sur le blog avec commentaires. J'ai voulu mettre à jour le nombre de commentaires d'un article automatiquement à chaque suppression d'un commentaire. Pour cela, j'ai mis dans models.py les deux lignes suivantes :
from django.db.models.signals import pre_delete
def suppression_commentaire(sender, instance, **kwargs):
"""Lorsqu'on supprime un commentaire, on décrémente
le nombre de commentaires."""
instance.article.nb_commentaires -= 1
pre_delete.connect(suppression_commentaire, sender=Commentaire)
Mais cela ne fonctionne pas : aucune mise à jour n'est réalisée quand je supprime un commentaire de l'interface Admin. De plus, d'un point de vue d'organisation du code, est-ce que ce ne serait pas plus propre d'avoir un fichier signals.py dans lequel on pourrait mettre tout les signaux ? Mais alors, comment dit-on proprement à django d'aller chercher les signaux là bas ?
GeoffNN: Il faut sauvegarder l'article une fois modifié :
from django.db.models.signals import pre_delete
def suppression_commentaire(sender, instance, **kwargs):
"""Lorsqu'on supprime un commentaire, on décrémente
le nombre de commentaires."""
instance.article.nb_commentaires -= 1
instance.article.save()
pre_delete.connect(suppression_commentaire, sender=Commentaire)
Pour Python 3, tentez d'utiliser la commande python3 au lieu de python. Si cela marche, il vous faut alors changer le lien symbolique de l'exécutable Python (voir ici, http://stackoverflow.com/a/3339564/1433392)
Pour le urls.py, je ne peux pas plus vous aider sans le message d'erreur...
Si je change le lien symbolique, les application exécutant python 2.7 ne seront pas affectée? (celle qui se base sur l’interpréteur ou les script pointant sur /bin/python)
Mon erreur est :
NameError at /
name 'patterns' is not defined
Request Method:
GET
Request URL:
http://localhost:8000/
Django Version:
1.8.3
Exception Type:
NameError
Exception Value:
name 'patterns' is not defined
Exception Location:
/media/Data/home/Documents/Academique/Science_dures/Info/Web/blog2_sansFramework/Blog/Blog/urls.py in <module>, line 23
Si vous modifiez le lien vers l'exécutable, à chaque fois que vous lancez "python ....py", vous utiliserez python3. C'est pour cela que l'on conseille généralement de faire des environnements virtuels pour garder une version de Python et les dépendances du projet isolé de vos autres projets, cf http://sametmax.com/les-environnement-virtuels-python-virtualenv-et-virtualenvwrapper/
Pour votre erreur, il vous manque une ligne d'import dans votre fichier :
from django.conf.urls import patterns, include, url
Bonjour à tous, de mon coté j'ai un petit soucis pour l'envoi de l'activité 1 "créez une application de blog complète".
- Tout fonctionne normalement. Je duplique tout mon dossier...
- Après j'y supprime tous les fichiers ".pyc" partout, tous les dossiers "__pycache__" et la base de donnée "db.sqlite3"...
- Je lance "python manage.py makemigrations blog" à la racine du dossier. Il m'indique "no changes detected in app 'blog' "
- ensuite je lance "python manage.py migrate blog", mais au bout d'un moment ça me sort "RuntimeError: Error creating new content types. Please make sure contenttypes is migrated before trying to migrate apps individually."
Le problème ne se pose pas si je fais "makemigration / migrate" sans cibler l'app "blog"... C'est grave ou c'est tout de même bon pour avoir tous les points ?
Ensuite, je voulais savoir, si on supprime toute la base de donnée, on a plus aucun article sur l'accueil du blog ni les login d'admin, du coup le correcteur va devoir se créer un super admin ?
Je me pose ces questions parce-que je visualise mal la procédure de correction... Merci pour le coup de patte.
En effet, le migrate blog ne peut pas marcher si vous n'avez pas créé la base initialement (car il manque la table des utilisateurs et cette fameuse table contenttypes entre autres). Ce n'est pas absolument pas grave de faire un migrate plus global, ça permet même de s'assurer que tout est bien passé (cela prend juste un peu plus de temps quand vous avez des dizaines d'apps)
Pour la base, oui, le correcteur doit créer la base (via un migrate) puis un superadmin pour tester, ce qui devrait se faire en quelques secondes sans soucis particulier logiquement.
Oui je me disais bien aussi... Mais comme sur l'activité il est spécifié :
Pour que vous receviez tous les points, il faut que votre correcteur arrive à accéder à votre blog en faisant les opérations suivantes :
Dézipper le projet Django que vous aurez fourni
À la racine du projet, effectuer les commandes suivantes en console :
python manage.py makemigrations blog
python manage.py migrate blog
python manage.py runserver
Du coup, moi de mon coté, je prépare mon petit dossier, supprime tout ce qu'il faut. Pour vérifier, je lance les commandes "exactes", du correcteur... et ça marche pas ! Bon pas que je sois psychorigide hein, je voulais juste être sûr d'avoir tous les points même si il faut faire :
Par contre oui, coté de la correction je pense qu'il faudrait aussi parler de la création d'un superuser (et modifier les commandes comme vu plus haut)
Aussi, j'ai remarqué que pour le premier barème, il peut y avoir 3 points... Mais le maximum attribuable est de deux... :-P
En tous cas, merci pour ce cours ! C'est bien expliqué et ça sera peut-être ma première certification ! (Et pour un quelqu'un sans aucun diplôme comme moi, c'est toujours ça de pris !! :D)
bjr j sui novice en django ce pour je des problemes de debutant avec mon formulaire qui n stocke pas mes donnees dans la base j veux savoir l'erreur voici la view
def sinscrire(request):
# if this is a POST request we need to process the form data
if request.method == 'POST':
# create a form instance and populate it with data from the request:
form = InscriptionForm(request.POST)
# check whether it's valid:
if form.is_valid():
email=form.cleaned_data["email"]
username=form.cleaned_data["username"]
password=form.cleaned_data["password1"]
password=form.cleaned_data["password2"]
# process the data in form.cleaned_data as required
# ...
# redirect to a new URL:
return HttpResponseRedirect('/thanks/')
# if a GET (or any other method) we'll create a blank form
else:
form = InscriptionForm()
print locals()
return render(request, 'frontend/inscription.html', {'form': form})
et le form est la
class InscriptionForm(forms.Form):
class Meta:
model = Profil
email = forms.EmailField(widget=forms.TextInput(attrs=dict(attrs_dict,
maxlength=75)),
label=_("Email"))
username = forms.RegexField(regex=USERNAME_RE,
max_length=30,
widget=forms.TextInput(attrs=attrs_dict),
label=_("Nom"),
error_messages={'invalid': _('le nom d utilisateur ne doit pas contenir des signes ou des caracteres .')})
password1 = forms.CharField(widget=forms.PasswordInput(attrs=attrs_dict,
render_value=False),
label=_("Mot de passe"))
password2 = forms.CharField(widget=forms.PasswordInput(attrs=attrs_dict,
render_value=False),
label=_("Retapez Mot de passe"))
J'ai une petite question, j'en suis aux vues génériques, section "Afficher un article via DetailView", Je souhaiterais, via ma page d'accueil, où je liste tous mes articles, afficher un article en détail.
Mais je vois pas comment, à partir de mon template, formater l'URL correctement pour appeler l'article complet:
class LireArticle(DetailView):
context_object_name = "article"
model = Article
template_name = "blog/lire.html"
# get_queryset pourrait être utilisé pour personnalisé la selection (pour afficher un article que si il était
# publique par exemple
def get_object(self):
# Nous récupérons l'objet via la super-classe
article = super(LireArticle, self).get_object()
article.nbVues += 1
article.save()
return article
et l'url dans mon template accueil.html:
<p><a href="{% url "blog.views.LireArticle" article.id %}" class="btn btn-primary">Lire la suite</a></p>
Si je passe directement par l'url configurée (/article/2), l'article s'affiche bien, par contre pour passer de ma page d'accueil à l'article détaillé j'ai le message suivant:
Reverse for 'blog.views.LireArticle' with arguments '(1,)' and keyword arguments '{}' not found. 0 pattern(s) tried: []
et le form est la