Djangoadmin中创建模型的djangurant

2024-04-27 10:10:03 发布

您现在位置:Python中文网/ 问答频道 /正文

我开始尝试django-mutant 0.0.2(在django 1.4.2)上,但是由于缺少文档,我几乎一无所获。根据我对项目描述的理解,我可以使用它动态地创建我的模型,所以我想我可以将它与django-admin接口连接起来,这样我就可以创建模型并在那里定义它的所有字段。我认为这是最好的选择。在

我把这个放在settings.py

INSTALLED_APPS = (
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.sites',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'django.contrib.admin',
    'south',
    'polymodels',
    'mutant',
    'mutant.contrib.boolean',
    'mutant.contrib.temporal',
    'mutant.contrib.file',
    'mutant.contrib.numeric',
    'mutant.contrib.text',
    'mutant.contrib.web',
    'mutant.contrib.related',
    'dynamodels'   # this is the name of my testapp
)

我打开了django-mutant的源代码来确定我应该做什么,我认为只要将mutant.models.ModelDefinition和{}导入我的admin.py并注册它们就足够了,所以我试着这样做:

^{pr2}$

在syncdb之后,我让它运行起来,在我的管理界面中有一个“变种”部分,里面有一个“模型定义”和“字段”。我成功地添加了一个模型,尽管我不能指定INSTALLED_APPS列表中的任何appname。添加一个字段失败得很严重,因为它的Model def参数我确实选择了我之前创建的模型(它是列表中唯一的一个),而且我确实为Content type选择了“整型字段定义”。点击“保存”按钮给我的是:

NotImplementedError at /admin/mutant/fielddefinition/add/

No exception supplied
...
...
/home/user/dev/virenvs/dynamicmodels/lib/python2.6/site-packages/django_mutant-0.0.2-py2.6.egg/mutant/models/field/__init__.py in save
        return super(FieldDefinition, self).save(*args, **kwargs) ...

/home/user/dev/virenvs/dynamicmodels/lib/python2.6/site-packages/django_polymodels-1.0.1-py2.6.egg/polymodels/models.py in save
        return super(BasePolymorphicModel, self).save(*args, **kwargs) ...

/home/user/dev/virenvs/dynamicmodels/lib/python2.6/site-packages/django_mutant-0.0.2-py2.6.egg/mutant/models/model/__init__.py in save
        self.model_def.model_class(force_create=True) ...

/home/user/dev/virenvs/dynamicmodels/lib/python2.6/site-packages/django_mutant-0.0.2-py2.6.egg/mutant/models/model/__init__.py in model_class
            model_class = self._create_model_class(existing_model_class) ...

/home/user/dev/virenvs/dynamicmodels/lib/python2.6/site-packages/django_mutant-0.0.2-py2.6.egg/mutant/models/model/__init__.py in _create_model_class
        attrs = self.get_model_attrs(existing_model_class) ...

/home/user/dev/virenvs/dynamicmodels/lib/python2.6/site-packages/django_mutant-0.0.2-py2.6.egg/mutant/models/model/__init__.py in get_model_attrs
                            for f in self.fielddefinitions.select_subclasses())) ...

/home/user/dev/virenvs/dynamicmodels/lib/python2.6/site-packages/django_mutant-0.0.2-py2.6.egg/mutant/models/model/__init__.py in <genexpr>
                            for f in self.fielddefinitions.select_subclasses())) ...

/home/user/dev/virenvs/dynamicmodels/lib/python2.6/site-packages/django_mutant-0.0.2-py2.6.egg/mutant/models/field/__init__.py in field_instance
        cls = self.get_field_class() ...

/home/user/dev/virenvs/dynamicmodels/lib/python2.6/site-packages/django_mutant-0.0.2-py2.6.egg/mutant/models/field/__init__.py in get_field_class
            raise NotImplementedError 

所以这可能不是我定义字段(甚至是模型)的方式。。在这个项目的页面上有一个代码段,它将FieldDefinition类的子类化,创建一个DateFieldDefinition,如果我把这个代码段放到我的models.py中并在我的管理中注册该类,我就可以成功地添加任何类型的字段。这是否意味着我必须将我想使用的所有字段类型子类化才能在管理中创建它们?当我以这种方式创建它们时,它们是否实际绑定到我的模型上?是否有一个有效的例子来展示至少一些基本的东西? 抱歉,这是我能想到的最短版本,任何建议都将不胜感激。在

更新: 我在指定我正在尝试的版本时犯了一个错误,我得到了最新开发版本的NotImplementedError(顺便说一句,它也是0.0.2),但是当我尝试从PyPi获得的与dev相同的实际0.0.2时,我得到了一个表单错误,没有错误消息,但是在验证时肯定失败了。所以一般来说,我并不接近解决方案。在

更新2: 我在admin中动态注册了variant的基本字段类型,现在我可以使用这个管理代码片段添加/更改/删除模型和字段:

from django.contrib import admin

from mutant import models

for field_type in models.FieldDefinitionBase._field_definitions.values():
    attrs = {'model': field_type}
    FieldDefAdmin = type('{0}Admin'.format(field_type.__name__),
                         (admin.ModelAdmin,),
                         attrs)
    admin.site.register(field_type, FieldDefAdmin)


class ModelDefinitionAdmin(admin.ModelAdmin):
    model = models.ModelDefinition

admin.site.register(models.ModelDefinition, ModelDefinitionAdmin)

但是,当我从mysql控制台检查数据库中的实际数据时,数据库中不存在我的表。有一些变种的表,它们包含了关于我的模型和字段的条目,但是我认为一旦动态模型类被构造出来,它也会按原样写入数据库。在

更新3: 事实上我错了,这个表是在我的数据库中找到的,它只是以“变种人”作为前缀,所以我没有认出它在那里。看起来这将是一个有效的方法来使用它,虽然要制作一个像样的用户友好的界面来操作它需要更多的工作。在


Tags: djangoinpydev模型fieldhomemodel
1条回答
网友
1楼 · 发布于 2024-04-27 10:10:03

好吧,我很抱歉,但我太忙了(可能更懒了),没法像我说的那样完成一个像样的应用程序。但至少有一点帮助,我创建了一个关于这个主题的肮脏的博客文章,并为变种人添加了一个CRUD应用程序示例,但要注意,它确实很基础,只是为了演示启动和运行的前几个步骤。在

http://integricho.github.io/2013/07/22/mutant-introduction/

https://github.com/integricho/mutant-sample-app

相关问题 更多 >