2012-07-25 8 views
8

を呼び出した際にエラーがジャンゴ:私のmodels.py内の問題でエラーが発生しました。ここメタクラス拠点

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

あるクラス

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): 

正確にはどういう意味かわかりません。私のモデルをモデルから継承するにはどうすればいいですか?モデルとフォーム。同じクラス内のフォームですか?クラスを作成するときに2つの値を渡すことはできませんか?もしそうなら、どのように?

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 

完全トレースバック:

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

なぜあなたはしたいですか?フォームを作成する場合は、別のクラスを作成します。 – Thomas

+0

郡と郵便番号はビジネスにリンクしているためです。私はそれぞれのレコードに一つずつアクセスするので、それらを同じテーブルに置くことは賢明ではありませんか? – jdx

+0

エラーを完全に表示してください。 http://sscce.org/ – Marcin

答えて

10

これは問題です:

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

あなたはモデルとフォームを継承しようとしています。あなたはすることはできません、あなたはしないでください。

派生クラスのメタクラスは、すべてのベースのメタクラスの(厳密ではない)サブクラスでなければならないからです。フォームは、メタクラスを持っています

__metaclass__ = DeclarativeFieldsMetaclass 

モデルもメタクラスを持っています

__metaclass__ = ModelBase 

あなたがこれを行うとしたら、あなたはそれらの両方から派生したメタクラスを設定する必要があります。

しかし、djangoにはモデルをモデル化するフォームを作成するためのModelFormsがあり、ここで複雑さを軽減できます。フォームから継承をやめてください。

+0

私はforms.Formを削除し、ローカルフレーバーのものをそのまま使って自分の "フォーム"を残しました。これはうまくいくようです。私はフォーム呼び出しから何も派生していないからです。ご協力いただきありがとうございます。 – jdx

+0

@jdxようこそ。この回答を受け入れて投票してください。 – Marcin

関連する問題