Django: Грешка при извикване на базите на метакласа

Тук е грешката

TypeError: Грешка при извикване на базите на метакласа конфликт на метаклас: метакласът на производен клас трябва да бъде (нестрог) подклас на метакласовете на всички негови бази

Въпросният клас в моя 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)

Редът, на който получавам грешката:

name = models.CharField(max_length=128)

Но аз (мисля) това означава това:

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

Не съм сигурен какво точно означава, как мога да наследя моите модели от models.Model и forms.Form в рамките на един и същи клас? Не мога ли да предам две стойности, когато създавам моя клас? Ако да как?

ОЩЕ РЕДАКТИРАНЕ

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

Пълно проследяване:

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

person jdx    schedule 25.07.2012    source източник
comment
Защо бихте искали? Ако искате да създавате формуляри, направете отделен клас за това.   -  person Thomas    schedule 25.07.2012
comment
Тъй като окръгът и пощенският код са свързани с бизнеса. Не е ли разумно да ги имам на една и съща маса, тъй като ще имам достъп до всеки запис един по един?   -  person jdx    schedule 25.07.2012
comment
Моля, покажете грешката изцяло. sscce.org   -  person Marcin    schedule 26.07.2012
comment
Редактирах оригиналния си пост. Всякакви улики ще бъдат оценени, мисля, че може да има нещо общо с конфликт може би в моя внос?   -  person jdx    schedule 26.07.2012
comment
@jdx Мисля, че трябва да прочетете какво представляват формите на Django. Те нямат нищо общо с масите.   -  person Thomas    schedule 26.07.2012


Отговори (1)


Това е проблема:

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

Опитвате се да наследите от модел и форма. Не можете и не трябва.

Не можете, защото метакласът на производен клас трябва да бъде (нестрог) подклас на метакласовете на всички негови бази. Формата има метаклас:

__metaclass__ = DeclarativeFieldsMetaclass

Моделът също има метаклас:

__metaclass__ = ModelBase

Ако трябваше да направите това, ще трябва да зададете метаклас, който произлиза и от двете.

Въпреки това не трябва да правите това, защото django има ModelForms, които съществуват, за да създават форми, които моделират модели, спестявайки ви проблемите от сложността тук. Просто спрете да наследявате от Form.

person Marcin    schedule 25.07.2012
comment
Премахнах forms.Form и оставих формулярите си, използвайки местните вкусови неща, каквито са, и изглежда, че работи. Тъй като не извличам нищо от forms.* call. Благодаря за вашата помощ. - person jdx; 26.07.2012
comment
@jdx Няма за какво. Моля, приемете този отговор и гласувайте за него. - person Marcin; 26.07.2012