je veux remplir django_site table quand je cours après syncdb au départ comment puis-je faire j'ai un seul sitePopulate automatique lorsque syncdb avec fixation pour django site
Répondre
Vous pouvez utiliser l'interface d'administration, de le shell, ou le script (si vous cherchez une solution automatisée). Voici comment faire de la coquille (et ce que vous mettriez dans le script):
[[email protected] projects]$ python manage.py shell
>>> from django.contrib.sites.models import Site
>>> newsite = Site(name="Test",domain="test.com")
>>> newsite.save()
Si vous voulez faire cela automatiquement, essayez cette
from django.contrib import sites
from django.db.models import signals
from django.conf import settings
def create_site(app, created_models, verbosity, **kwargs):
"""
Create the default site when when we install the sites framework
"""
if sites.models.Site in created_models:
sites.models.Site.objects.all().delete()
site = sites.models.Site()
site.pk = getattr(settings, 'SITE_ID', 1)
site.name = getattr(settings, 'SITE_NAME', 'Example')
site.domain = getattr(settings, 'SITE_DOMAIN', 'example.com')
site.save()
signals.post_syncdb.connect(create_site, sender=sites.models)
Ce code doit être exécuté à chaque fois une commande de gestion est exécutée. Donc, vous pouvez le mettre dans management/__init__.py
pour n'importe quelle application. Ensuite, il suffit d'ajouter SITE_ID
, SITE_NAME
et SITE_DOMAIN
à votre settings.py
.
Une solution simple consiste à créer un appareil initial_data.json pour l'application Sites qui remplacera la valeur par défaut.
Par exemple, mon appareil à /myproject/myapp/fixtures/initial_data.json:
[
{
"model": "sites.site",
"pk": 1,
"fields": {
"domain": "myproject.mydomain.com",
"name": "My Project"
}
}
]
Une petite note: Parce que ce sont des données communes pour l'ensemble du projet, il pourrait être une bonne idée de stocker l'appareil à/myproject/appareils/ou à une application/myproject/commons/(comme je le fais) au lieu de le stocker avec juste quelques app. Cela permet aux données d'être faciles à trouver et rend les applications un peu plus réutilisables.
Une deuxième remarque: Django permet d'utiliser plusieurs projecteurs initial_data.json dans plusieurs applications (L'utilisation d'un ensemble mixte de projecteurs initial_data.json et initial_data.yaml n'a pas fonctionné comme prévu: P). Ils seront tous automatiquement utilisés pour pré-remplir la base de données lors de l'exécution de syncdb.
Quelques références:
- Django - Providing initial data with fixtures
- Le deuxième commentaire à a codespatter.com blog post
je crois comprendre que les appareils sont la meilleure façon de le faire. Voir la réponse d'Askell ci-dessous. – Josh