Django ModelAdmin save_formset,如何获取保存的更改?

时间:2014-12-10 13:11:20

标签: python mysql django

我无法应付一项简单的任务...... 在编辑形式的管理界面中,我有一个带父对象的链接对象(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'),)

0 个答案:

没有答案