具有预定义内联的django管理表单

pho*_*nix 7 python django django-models django-forms django-admin

问题是让内联模型根据其他模型预先选择一些领域.

我们举一个例子:

class Document(models.Model):
    DOC_TYPES = ((DC1, 'Doc type 1'), (DC2, 'Doc type 2'))
    doctype = model.CharField(choices=DOC_TYPES, default=DC1)

class OptionCategory(models.Model):
    name = model.CharField()

class Option(models.Model):
    document = models.ForeignKey(Document)
    option_category = models.ForeignKey(OptionCategory)
    some_data = models.CharField()
Run Code Online (Sandbox Code Playgroud)

假设该选项是在文档模型admin中内联定义的.

OptionCategory是必要的 - 那些可能由管理员添加 - 我想有一个文档的创建表单,内联表单中有很多选项模型,因为有选项类别.这可以使用Option模型管理中的附加功能轻松实现.问题是:

  1. 如何显示每个都预先选择了不同选项类别的内联字段?
  2. 如何动态更改选项(基于Document.doctype添加类似的doctype字段后OptionCategory) - 最好使用ajax?

小智 5

  1. 如何呈现内联字段,每个字段都预选了不同的选项类型:

模型.py

    class DocType(models.Model):
        name = models.CharField(max_length=255)

        def __unicode__(self):
            return self.name


    class Document(models.Model):
        doc_type = models.ForeignKey(DocType)
        some_data = models.CharField(max_length=255)

        def __unicode__(self):
            return self.some_data


    class OptionType(models.Model):
        name = models.CharField(max_length=255)
        doc_type = models.ForeignKey(DocType)

        def __unicode__(self):
            return self.name


    class Option(models.Model):
        document = models.ForeignKey(Document)
        option_type = models.ForeignKey(OptionType)
        some_data = models.CharField(max_length=255)

        def __unicode__(self):
            return self.some_data
Run Code Online (Sandbox Code Playgroud)

管理文件

 class InlineOption(admin.TabularInline):
    model = Option
    extra = 3

    initial = [
        {'some_data': 'init_val1', 'option_type': 1},
        {'some_data': 'init_val2'},
    ]

    create_from_default = True

    def get_formset(self, request, obj=None, **kwargs):
        initial = self.initial[:]

        class _Form(forms.ModelForm):
            form_initial = initial

            def __init__(self, *args, **kwargs):
                if len(self.form_initial) and not 'instance' in kwargs:
                    kwargs['initial'] = self.form_initial.pop(0)
                return super(_Form, self).__init__(*args, **kwargs)

        if self.create_from_default:
            if request.method == 'GET':
                self.form = _Form
            else:
                self.form = forms.ModelForm
        else:
            self.form = _Form

        return super(InlineOption, self).get_formset(request, obj, **kwargs)



class AdminDocument(admin.ModelAdmin):
    inlines = [InlineOption]
Run Code Online (Sandbox Code Playgroud)