9

これがエラーです

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からモデルを継承するにはどうすればよいですか?クラスを作成するときに2つの値を渡すことはできませんか?もしそうなら、どのように?

別の編集

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
4

1 に答える 1

10

これが問題です:

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

モデルとフォームから継承しようとしています。あなたはできません、そしてあなたはすべきではありません。

派生クラスのメタクラスは、そのすべてのベースのメタクラスの(厳密ではない)サブクラスでなければならないため、これはできません。フォームにはメタクラスがあります。

__metaclass__ = DeclarativeFieldsMetaclass

モデルにはメタクラスもあります。

__metaclass__ = ModelBase

これを行う場合は、両方から派生するメタクラスを設定する必要があります。

ただし、djangoにはModelFormsがあり、モデルをモデル化するフォームを作成するために存在するため、これを行うべきではありません。これにより、ここでの複雑さの問題を回避できます。フォームからの継承を停止するだけです。

于 2012-07-25T20:07:11.330 に答える