2013-04-07 2 views
0

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

왜 모델가 비활성화 보여 않습니다 관리 인터페이스에서? 장고는 그들을 성공적으로 등록합니다.

+0

여기에 비슷한 질문도있다 : [장고 관리자 작업에서 동적 모델 등록은] (http://stackoverflow.com/questions/13184154/django-admin-registering-dynamic-model-from-action) . 그러나 또한 해결되지 않았습니다. – Yuriy

답변

0

아마, 먼저 generation/admin.py 파일을 편집 (또는 생성)하고 django-admin 부분에 응용 프로그램 모델을 등록하기 위해이 코드를 추가해야합니다.

from django.contrib import admin 
from myproject.generation.models import Rooms, Users 

class RoomsAdmin(admin.ModelAdmin): 
    pass 


class UsersAdmin(admin.ModelAdmin): 
    pass 


admin.site.register(Rooms, RoomsAdmin) 
admin.site.register(Users, UsersAdmin) 
+0

불행히도 모델을 동적으로 생성하기 때문에 그건 도움이되지 않습니다. 내 장고 앱을 시작할 때까지 어떤 모델을 만들지 모르겠다. – Yuriy

관련 문제