我无法应付一项简单的任务...... 在编辑形式的管理界面中,我有一个带父对象的链接对象(TabularInline)。
from django.contrib import admin
from core.models import Model, drop, install, Field, reinstall
import os
from django.conf import settings
from django import forms
from django.contrib import messages
from django.db.models.signals import post_save
from django.dispatch import receiver
from django.db.models import get_app, get_models, get_model
class FieldAdminForm(forms.ModelForm):
class Meta:
model = Field
class FieldInline(admin.TabularInline):
model = Field
form = FieldAdminForm
extra = 1
class ModelAdmin(admin.ModelAdmin):
inlines = (FieldInline,)
def save_related(self, request, form, formsets, change):
if change:
fake = get_model('goods', request.POST['name'])
admin.site.unregister(fake)
drop(fake)
super(type(self), self).save_related(request, form, formsets, change)
new_model = Model.objects.get(name=request.POST['name'])
new_fake = new_model.get_django_model()
install(new_fake)
在save_related函数中,我创建模型并将模型安装到mysql表
def install(model):
from django.core.management import sql, color
style = color.no_style()
cursor = connection.cursor()
sql, references = connection.creation.sql_create_model(model, style)
for statements in sql:
cursor.execute(statements)
def drop(model):
opts = model._meta
cursor = connection.cursor()
cursor.execute("DROP TABLE IF EXISTS "+opts.db_table+"")
transaction.commit_unless_managed()
如果我在表单中更改了对象,在save_related中,我得到一个以前创建的模型并删除一个链接表但是在新表中保存字段后没有更新但是保持旧...
现场和模型模型
class Model(models.Model):
app = models.ForeignKey(App, related_name='models')
name = models.CharField(max_length=255)
verbose_name = models.CharField(max_length=255)
verbose_name_plural = models.CharField(max_length=255)
slogan = models.CharField(max_length=255)
desc = models.TextField(blank=True)
image = models.ImageField(upload_to = "uploads/product/category/", blank=True)
def __unicode__(self):
return self.verbose_name_plural
def __str__(self):
return self.verbose_name_plural
def get_django_model(self):
fields = [(f.name, f.get_django_field()) for f in self.fields.all()]
options = {'verbose_name':self.verbose_name, 'verbose_name_plural':self.verbose_name_plural}
return create_model(str(self.name), fields, str(self.app.module), str(self.app.module), options)
class Meta:
unique_together = (('app', 'name'),)
def is_valid_field(field_data):
if hasattr(models, field_data) and issubclass(getattr(models, field_data), models.Field):
return
raise ValidationError("This is not a valid field type.")
class Field(models.Model):
model = models.ForeignKey(Model, related_name='fields')
name = models.CharField(max_length=255, blank=True)
verbose_name = models.CharField(max_length=255, blank=True)
type = models.CharField(max_length=255, validators=[is_valid_field])
max_length = models.IntegerField(blank=True)
null = models.BooleanField(verbose_name="NULL")
blank = models.BooleanField()
def get_django_field(self):
s = [(u'max_length', self.max_length), (u'verbose_name', self.verbose_name)]
return getattr(models, self.type)(**dict(s))
class Meta:
unique_together = (('model', 'name'),)