2012-07-25 11 views
8

Đây là lỗiDjango: Lỗi khi gọi các căn cứ 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

Lớp trong câu hỏi trong vòng models.py tôi

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) 

Dòng Tôi nhận được lỗi trên:

name = models.CharField(max_length=128) 

Nhưng tôi nghĩ nó có nghĩa là:

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

Tôi không chắc nó có ý nghĩa gì, làm thế nào tôi có thể kế thừa các mô hình của mình từ mô hình.Model và forms.Form trong cùng một lớp? Tôi không thể chuyển hai giá trị khi tạo lớp học của mình? Nếu thế thì sao?

KHÁC 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 

Full traceback:

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

Tại sao bạn muốn? Nếu bạn muốn tạo biểu mẫu, hãy tạo một lớp riêng biệt cho điều đó. – Thomas

+0

Vì hạt và mã bưu điện được liên kết với doanh nghiệp. Không phải là nó khôn ngoan để có chúng trên cùng một bảng, vì tôi sẽ truy cập từng bản ghi từng người một? – jdx

+0

Vui lòng hiển thị lỗi đầy đủ. http://sscce.org/ – Marcin

Trả lời

10

Đây là vấn đề:

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

Bạn đang cố gắng để kế thừa từ mẫu và Mẫu. Bạn không thể, và bạn không nên.

Bạn không thể vì lớp metaclass của một lớp dẫn xuất phải là lớp con (không nghiêm ngặt) của metaclasses của tất cả các cơ sở của nó. Mẫu có metaclass:

__metaclass__ = DeclarativeFieldsMetaclass 

mẫu cũng có một metaclass:

__metaclass__ = ModelBase 

Nếu bạn đã làm điều này, bạn sẽ cần phải thiết lập một metaclass mà xuất phát từ cả hai.

Tuy nhiên, bạn không nên làm điều này, bởi vì django có ModelForms, tồn tại để tạo biểu mẫu mô hình hóa mô hình, giúp bạn tiết kiệm sự phức tạp ở đây. Chỉ cần dừng kế thừa từ Biểu mẫu.

+0

Tôi đã xóa các biểu mẫu này. Và để lại "các biểu mẫu" của tôi bằng cách sử dụng các công cụ hương vị địa phương như hiện nay và có vẻ như nó hoạt động. Bởi vì tôi không lấy bất cứ thứ gì từ một mẫu đơn. Cảm ơn bạn đã giúp đỡ. – jdx

+0

@jdx Bạn được chào đón. Vui lòng chấp nhận câu trả lời này và bỏ phiếu. – Marcin