2012-07-25 13 views
8

Hier Aufruf ist der FehlerDjango: Fehler, wenn die Metaklasse Basen

TypeError: Error when calling the metaclass bases metaclass conflict: the metaclass of a derived class must be a (non-strict) subclass of the metaclasses of all its bases

Die Klasse in Frage: In meinem models.py

class Business(models.Model, forms.Form): 
    name = models.CharField(max_length=128) 
    tel_no = models.CharField(max_length=11) 
    address_ln1 = models.CharField(max_length=128) 
    address_ln2 = models.CharField(max_length=128) 
    city = models.CharField(max_length=64) 
    county = GBCountySelect() 
    postcode = GBPostcodeField() 
    website = models.URLField(max_length=128) 
# Logging Info 
    slug = models.SlugField() 
    date_added = models.DateField(auto_now_add=True) 
    time_added = models.TimeField() 
    added_by_user = models.CharField(max_length=64) 
    last_edit_time = models.TimeField(auto_now=True) 
    last_edit_date = models.DateField(auto_now=True) 

Die Linie Ich erhalte den Fehler auf:

name = models.CharField(max_length=128) 

Aber ich (glaube) bedeutet dies ein:

class Business(models.Model, forms.Form): 

Ich bin mir nicht sicher, was es genau bedeutet, wie kann ich meine Modelle von models.Model und forms.Form innerhalb der gleichen Klasse erben? Kann ich beim Erstellen meiner Klasse keine zwei Werte übergeben? Wenn das so ist, wie?

ANOTHER EDIT

All my imports 
from django.db import models 
from django import forms 
from django.contrib.localflavor import generic 
from django.contrib.localflavor.gb.forms import GBPostcodeField, GBCountySelect 

Vollzurückverfolgungs:

Traceback (most recent call last): 
    File "manage.py", line 10, in <module> 
    execute_from_command_line(sys.argv) 
    File "/home/jws1000/.virtualenvs/glutenfree/lib/python2.7/site-packages/django/core/management/__init__.py", line 443, in execute_from_command_line 
    utility.execute() 
    File "/home/jws1000/.virtualenvs/glutenfree/lib/python2.7/site-packages/django/core/management/__init__.py", line 382, in execute 
    self.fetch_command(subcommand).run_from_argv(self.argv) 
    File "/home/jws1000/.virtualenvs/glutenfree/lib/python2.7/site-packages/django/core/management/base.py", line 196, in run_from_argv 
    self.execute(*args, **options.__dict__) 
    File "/home/jws1000/.virtualenvs/glutenfree/lib/python2.7/site-packages/django/core/management/base.py", line 231, in execute 
    self.validate() 
    File "/home/jws1000/.virtualenvs/glutenfree/lib/python2.7/site-packages/django/core/management/base.py", line 266, in validate 
    num_errors = get_validation_errors(s, app) 
    File "/home/jws1000/.virtualenvs/glutenfree/lib/python2.7/site-packages/django/core/management/validation.py", line 30, in get_validation_errors 
    for (app_name, error) in get_app_errors().items(): 
    File "/home/jws1000/.virtualenvs/glutenfree/lib/python2.7/site-packages/django/db/models/loading.py", line 158, in get_app_errors 
    self._populate() 
    File "/home/jws1000/.virtualenvs/glutenfree/lib/python2.7/site-packages/django/db/models/loading.py", line 64, in _populate 
    self.load_app(app_name, True) 
    File "/home/jws1000/.virtualenvs/glutenfree/lib/python2.7/site-packages/django/db/models/loading.py", line 88, in load_app 
    models = import_module('.models', app_name) 
    File "/home/jws1000/.virtualenvs/glutenfree/lib/python2.7/site-packages/django/utils/importlib.py", line 35, in import_module 
    __import__(name) 
    File "/home/jws1000/envs/glutenfree/glutenfree/glutenfree/listings/models.py", line 9, in <module> 
    class Business(models.Model, forms.Form): 
    File "/home/jws1000/.virtualenvs/glutenfree/lib/python2.7/site-packages/django/db/models/base.py", line 41, in __new__ 
    new_class = super_new(cls, name, bases, {'__module__': module}) 
TypeError: Error when calling the metaclass bases 
    metaclass conflict: the metaclass of a derived class must be a (non-strict) subclass of the metaclasses of all its bases 
+0

Warum möchten Sie? Wenn Sie Formulare erstellen möchten, erstellen Sie eine separate Klasse dafür. – Thomas

+0

Da der Landkreis und die Postleitzahl mit dem Geschäft verknüpft sind. Ist es nicht klug, sie am selben Tisch zu haben, da ich auf jeden Eintrag einzeln zugreifen werde? – jdx

+0

Bitte den Fehler vollständig anzeigen. http://sscce.org/ – Marcin

Antwort

10

Das ist das Problem:

class Business(models.Model, forms.Form): 

Sie versuchen, von Modell und Formular erben. Du kannst nicht, und du solltest nicht.

Sie können nicht, da die Metaklasse einer abgeleiteten Klasse eine (nicht-strikte) Unterklasse der Metaklassen aller ihrer Basen sein muss. Form hat eine Metaklasse:

__metaclass__ = DeclarativeFieldsMetaclass 

Modell hat auch eine Metaklasse:

__metaclass__ = ModelBase 

Wenn Sie dies tun würden, müssten Sie eine Metaklasse setzen, die von beiden diejenigen ableitet.

Dies sollten Sie jedoch nicht tun, da django ModelForms enthält, die existieren, um Formulare zu erstellen, die Modelle modellieren, wodurch Sie das Problem der Komplexität hier vermeiden. Hör einfach auf, von Form zu erben.

+0

Ich habe die Forms.Form entfernt und meine "Forms" mit den lokalen Aromastoffen zurückgelassen, und es scheint zu funktionieren. Weil ich nichts von einem forms. * Anruf ableite. Danke für Ihre Hilfe. – jdx

+0

@jdx Gern geschehen. Bitte akzeptiere diese Antwort und stimme ab. – Marcin

Verwandte Themen