2017-12-24 5 views
1

Ich versuche derzeit, einen Blog mit Django zu bauen. Ich habe diesen Fehler nun seit ein paar Stunden erlebt. Ich bin mir nicht ganz sicher, ob das etwas mit den Verzeichnissen zu tun hat, aber der Fehler tritt auf, wenn ich versuche, mein Modell in der Datei admin.py zu registrieren.Django-Modul-Objekt ist nicht iterierbar

from django.contrib import admin 
from .models import Post 

# Register models 
admin.site.register(Post) 

die Verzeichnisse wie folgt aussehen:

blog 
    models 
     Post 
     Category 
    admin.py 
settings 
static 
templates 

Trace:

Unhandled exception in thread started by <function check_errors.<locals>.wrapper at 0x7ffb589a67b8> 
Traceback (most recent call last): 
    File "/usr/lib/python3.6/site-packages/django/utils/autoreload.py", line 225, in wrapper 
    fn(*args, **kwargs) 
    File "/usr/lib/python3.6/site-packages/django/core/management/commands/runserver.py", line 112, in inner_run 
    autoreload.raise_last_exception() 
    File "/usr/lib/python3.6/site-packages/django/utils/autoreload.py", line 248, in raise_last_exception 
    raise _exception[1] 
    File "/usr/lib/python3.6/site-packages/django/core/management/__init__.py", line 327, in execute 
    autoreload.check_errors(django.setup)() 
    File "/usr/lib/python3.6/site-packages/django/utils/autoreload.py", line 225, in wrapper 
    fn(*args, **kwargs) 
    File "/usr/lib/python3.6/site-packages/django/__init__.py", line 24, in setup 
    apps.populate(settings.INSTALLED_APPS) 
    File "/usr/lib/python3.6/site-packages/django/apps/registry.py", line 120, in populate 
    app_config.ready() 
    File "/usr/lib/python3.6/site-packages/django/contrib/admin/apps.py", line 23, in ready 
    self.module.autodiscover() 
    File "/usr/lib/python3.6/site-packages/django/contrib/admin/__init__.py", line 26, in autodiscover 
    autodiscover_modules('admin', register_to=site) 
    File "/usr/lib/python3.6/site-packages/django/utils/module_loading.py", line 47, in autodiscover_modules 
    import_module('%s.%s' % (app_config.name, module_to_search)) 
    File "/usr/lib/python3.6/importlib/__init__.py", line 126, in import_module 
    return _bootstrap._gcd_import(name[level:], package, level) 
    File "<frozen importlib._bootstrap>", line 994, in _gcd_import 
    File "<frozen importlib._bootstrap>", line 971, in _find_and_load 
    File "<frozen importlib._bootstrap>", line 955, in _find_and_load_unlocked 
    File "<frozen importlib._bootstrap>", line 665, in _load_unlocked 
    File "<frozen importlib._bootstrap_external>", line 678, in exec_module 
    File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed 
    File "/home/hallak/Projects/hallak.io/hallak_blog/admin.py", line 5, in <module> 
    admin.site.register(Post) 
    File "/usr/lib/python3.6/site-packages/django/contrib/admin/sites.py", line 102, in register 
    for model in model_or_iterable: 
TypeError: 'module' object is not iterable 

Beitrag:

from django.db import models 
from django.utils import timezone 


class Post(models.Model): 
    # Auto-generated ID 
    id = models.AutoField(primary_key=True) 

    # Title 
    title = models.CharField(max_length=100) 

    # Slug 
    slug = models.SlugField(max_length=100) 

    # Content 
    body = models.TextField() 

    # Timestamps 
    created_on = models.DateField(auto_now_add=True) 
    published_on = models.DateTimeField(blank=True, null=True) 

    # Category 
    category = models.ForeignKey('.Category', on_delete=models.DO_NOTHING) 

    # Author 
    author = models.ForeignKey('auth.User', on_delete=models.DO_NOTHING) 

    # Publish post 
    def publish(self): 
     self.published_date = timezone.now() 
     self.save() 

    def __str__(self): 
     return self.title 

Kategorie:

from django.db import models 


class Category(models.Model): 
    # Auto-generated ID 
    id = models.AutoField(primary_key=True) 

    # Title 
    title = models.CharField(max_length=100) 

    # Slug 
    slug = models.SlugField(max_length=100) 

    # Timestamps 
    created_on = models.DateField(auto_now_add=True) 

Der Fehler passiert hier: https://github.com/django/django/blob/master/django/contrib/admin/sites.py#L100-L101

Immer, wenn ich die Registerlinie alles funktioniert kommentieren.

Antwort

4

Anstatt "von .models Import Post" zu schreiben, sollten Sie "from .models.Post import Post" schreiben.

Erster "Post" ist ein Modulname (Dateiname), zweiter ist ein Klassenname.

+0

Dies löste den ersten Fehler erzeugt aber noch einen 'Errors: hallak_blog.Post.category: (fields.E300) Feld definiert eine Beziehung mit dem Modell‚.Category‘, die entweder nicht installiert ist, oder abstrakt ist. hallak_blog.Post.category: (fields.E307) Das Feld hallak_blog.Post.category wurde mit einem verzögerten Verweis auf '.category' deklariert, aber die App '' ist nicht installiert. ' – hallaksec

+0

Modell "Category" sollte importiert werden das Post.py-Modul. Sie verwenden den Namen "Category" in der Post-Klasse, aber es ist nicht definiert. von ".Category" Import "Kategorie". – MihanEntalpo

+0

Sie sollten Ihre Modelle wirklich nicht in separaten Dateien ablegen. Obwohl das funktioniert, ist es verwirrend für jemanden, der neu bei Python und Django ist. Es ist auch die Ursache für beide Probleme. Verschiebe sie beide zurück in ein einziges models.py. –

Verwandte Themen