django - did you forget to register or load this tag
Django-Problema de importaciĆ³n de modelo circular (4)
Algo que no he mencionado en ningún lugar con suficiente detalle es cómo formular correctamente la cadena dentro de ForeignKey al hacer referencia a un modelo en una aplicación diferente. Esta cadena necesita ser app_label.model_name
. Y, muy importante, la app_label
no es toda la línea en INSTALLED_APPS, sino solo el último componente de la misma. Entonces, si INSTALLED_APPS se ve así:
INSTALLED_APPS = (
...
''path.to.app1'',
''another.path.to.app2''
)
luego, para incluir una clave externa a un modelo en la aplicación 2 en un modelo de aplicación1, debe hacer lo siguiente:
app2_themodel = ForeignKey(''app2.TheModel'')
Pasé bastante tiempo tratando de resolver un problema de importación circular (por lo que no pude simplemente from another.path.to.app2.models import TheModel
) antes de tropezar con esto, google / SO no fue de ayuda (todos los ejemplos tenían rutas de aplicaciones de componente único), así que con suerte esto ayudará a otros novatos django.
Realmente no entiendo esto, así que si alguien pudiera explicar cómo funciona esto, lo agradecería muchísimo. Tengo dos aplicaciones, Cuentas y Tema ... aquí está mi lista de configuraciones:
INSTALLED_APPS = (
''django.contrib.auth'',
''django.contrib.contenttypes'',
''django.contrib.sessions'',
''django.contrib.messages'',
''accounts'',
''themes'',
)
En las cuentas, estoy tratando de hacer esto:
from themes.models import Theme
class Account(models.Model):
ACTIVE_STATUS = 1
DEACTIVE_STATUS = 2
ARCHIVE_STATUS = 3
STATUS_CHOICES = (
(ACTIVE_STATUS, (''Active'')),
(DEACTIVE_STATUS, (''Deactive'')),
(ARCHIVE_STATUS, (''Archived'')),
)
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=250)
slug = models.SlugField(unique=True, verbose_name=''URL Slug'')
status = models.IntegerField(choices=STATUS_CHOICES, default=ACTIVE_STATUS, max_length=1)
owner = models.ForeignKey(User)
enable_comments = models.BooleanField(default=True)
theme = models.ForeignKey(Theme)
date_created = models.DateTimeField(default=datetime.now)
Y en mi modelo de tema:
class Theme(models.Model):
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=250)
slug = models.SlugField(unique=True, verbose_name=''URL Slug'')
date_created = models.DateTimeField(default=datetime.now)
class Stylesheet(models.Model):
id = models.AutoField(primary_key=True)
account = models.ForeignKey(Account)
date_created = models.DateTimeField(default=datetime.now)
content = models.TextField()
Django está echando el siguiente error:
from themes.models import Theme
ImportError: cannot import name Theme
¿Es esto algún tipo de problema de importación circular? Intenté usar una referencia perezosa, ¡pero eso tampoco parece funcionar!
Como la forma correcta de Django 1.7 es seguir así:
from django.apps import apps
YourModel = apps.get_model(''your_app_name'', ''YourModel'')
Ver: https://docs.djangoproject.com/ja/1.9/ref/applications/#django.apps.apps.get_model
Elimine la importación de Theme
y use el nombre del modelo como una cadena en su lugar.
theme = models.ForeignKey(''themes.Theme'')
Use la función get_model
de django.db.models
que está diseñada para las importaciones de modelo perezoso .:
MyModel = get_model(''app_name'', ''ModelName'')
En tu caso:
Theme = get_model(''themes'', ''Theme'')
Ahora puedes usar Theme