2012-07-25 12 views
8

Aquí está el errorDjango: Error al llamar a las bases MetaClass

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

la clase en cuestión dentro de mi 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) 

La línea que estoy recibiendo el error en:

name = models.CharField(max_length=128) 

Pero yo (creo) significa este:

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

No estoy seguro de lo que significa exactamente, ¿cómo puedo heredar mis modelos de models.Model y forms.Form dentro de la misma clase? ¿No puedo pasar dos valores cuando creo mi clase? ¿Si es así, cómo?

otra edición

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 

rastreo completo:

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

¿Por qué le gustaría? Si desea crear formularios, cree una clase separada para eso. – Thomas

+0

Porque el condado y el código postal están vinculados al negocio. ¿No es prudente tenerlos en la misma mesa, ya que accederé a cada registro uno por uno? – jdx

+0

Muestra el error completo. http://sscce.org/ – Marcin

Respuesta

10

Este es el problema:

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

Usted está tratando de heredar de modelo y la forma. No puedes, y no deberías.

No se puede porque la metaclase de una clase derivada debe ser una subclase (no estricta) de las metaclases de todas sus bases. Formulario tiene una metaclase:

__metaclass__ = DeclarativeFieldsMetaclass 

modelo también tiene una metaclase:

__metaclass__ = ModelBase 

Si se va a hacer esto, sería necesario establecer una metaclase que se deriva de ambas cosas.

Sin embargo, no debe hacer esto, porque django tiene ModelForms, que existen para crear formularios que modelan modelos, lo que le ahorra la molestia de la complejidad aquí. Solo deja de heredar de Formulario.

+0

Quité los formularios.Forma, y ​​dejé mis "formularios" usando el sabor local como estaba, y parece que funciona. Porque no obtengo nada de un formulario. * Llame. Gracias por tu ayuda. – jdx

+0

@jdx De nada. Por favor, acepte esta respuesta y vote por ella. – Marcin

Cuestiones relacionadas