yaml 설명 파일에서 내 앱을 시작할 때 동적으로 장고 모델을 생성합니다. 내가 장고 관리자에서 그들을 등록하지만, 그들은 관리자 인터페이스에서 사용 중지 표시됩니다. 모양은 this입니다.왜 내 모델이 django admin에서 비활성화되어 있습니까?
yaml 형식의 설명 파일에서 모델을 동적으로 생성하기 위해 manage.py 명령을 만들었습니다. 내가 모델 생성
from django.conf.urls import patterns, include, url
from django.contrib import admin
from generation import views
from generation.management.commands.updatemodels import Command
admin.autodiscover()
urlpatterns = patterns('',
url(r'^$', views.main, name='main'),
# url(r'^modgen/', include('modgen.foo.urls')),
url(r'^admin/', include(admin.site.urls)),
)
Command().handle('models.yaml')
을하고 이런 식으로 관리자에 등록 :
from django.core.management.base import BaseCommand
from django.core.management import call_command
import yaml
from generation.generate import generate_fields, generate_model
class Command(BaseCommand):
help = 'Generates or updates django models from specified file'
def handle(self, *args, **options):
try:
f = open(args[0], 'r')
models = yaml.safe_load(f)
f.close()
for name, definition in models.items():
fields = generate_fields(definition['fields'])
generate_model(name, definition['title'], fields, "generation", "generation.models")
call_command('syncdb', interactive=True)
except IOError:
self.stderr.write('Cannot open file: {0}'.format(args[0]))
except yaml.YAMLError as e:
self.stderr.write('Cannot parse file {0}: {1}'.format(args[0], e))
나는이 같은 루트 urls.py에서이 명령을 시동
from sys import stderr
from django.contrib import admin
from django.db import models
class Types():
INT = 'int'
CHAR = 'char'
DATE = 'date'
def generate_model(model_name, model_title, fields, app_label, module):
class Meta:
pass
if app_label:
setattr(Meta, 'app_label', app_label)
if model_title:
setattr(Meta, 'verbose_name_plural', model_title)
attrs = {'__module__': module, 'Meta': Meta}
if fields is not None:
attrs = dict(attrs.items() + fields.items())
model = type(model_name, (models.Model,), attrs)
admin.site.register(model)
def generate_fields(definition):
fields = {}
for field in definition:
fields[field['id']] = generate_field(field['title'], field['type'])
return fields
def generate_field(title, field_type):
if field_type == Types.CHAR:
return models.CharField(title, max_length=255)
elif field_type == Types.INT:
return models.IntegerField(title)
elif field_type == Types.DATE:
return models.DateField(title)
else:
stderr.write('Unknown field type specified: {0}'.format(field_type))
왜 모델가 비활성화 보여 않습니다 관리 인터페이스에서? 장고는 그들을 성공적으로 등록합니다.
여기에 비슷한 질문도있다 : [장고 관리자 작업에서 동적 모델 등록은] (http://stackoverflow.com/questions/13184154/django-admin-registering-dynamic-model-from-action) . 그러나 또한 해결되지 않았습니다. – Yuriy