Django:admin中的MultipleChoiceField可以继承先前保存的值

时间:2010-10-04 14:25:46

标签: django admin modelform

我在管理员的模型中隐藏以前选择的项目时遇到了麻烦。 我想使用 forms.CheckboxSelectMultiple 小部件,因为这是此用例中最直接的UI。它的工作原理是保存时,存储值。但是,在编辑以前保存的项目时,先前保存在此字段中的值不会反映在窗口小部件中。

UI示例:

alt text

发布后(编辑该项目,将其空白):

alt text

但是,在编辑项目时不使用小部件而是使用常规CharField时,它看起来像:

alt text

因此,由于某种原因,复选框小部件不会表示值?

这是我的简化设置,models.py

POST_TYPES = (
    ('blog',      'Blog'),
    ('portfolio',     'Portfolio'),
    ('beeldbank',     'Beeldbank'),
)

class Module(models.Model):
    title         =   models.CharField(max_length=100, verbose_name='title')        
    entriesFrom     =   models.CharField(max_length=100)

    def __unicode__(self):
       return self.title

forms.py:

class ModuleForm(forms.ModelForm):
    entriesFrom = forms.MultipleChoiceField(
            choices=POST_TYPES, 
            widget=CheckboxSelectMultiple, 
            label="Pull content from", 
            required=False,
            show_hidden_initial=True) 

    class Meta:
        model = Module

    def __init__(self, *args, **kwargs):
        super(ModuleForm, self).__init__(*args, **kwargs)

        if kwargs.has_key('instance'):
            instance = kwargs['instance']
            self.fields['entriesFrom'].initial = instance.entriesFrom

            logging.debug(instance.entriesFrom)

admin.py

class ModuleAdmin(admin.ModelAdmin):
    form = ModuleForm

因此,在编辑之前保存的项目并选择“blog”时,在 init 上调试会在self.fields ['entriesFrom']([u'blog',])上返回正确的值,但它没有反映在管理员的复选框中(没有显示为选中)。

修改

更新了ModuleForm类以传递初始值,但是在初始值中有一些值(“[u'blog']”)时,没有任何内容仍然预先填充。

4 个答案:

答案 0 :(得分:3)

解决方案:

用整数而不是字符串设置选项。

POST_TYPES = (
    (1,     'Blog'),
    (2,     'Portfolio'),
    (3,     'Beeldbank'),
)
该死的,这不值得打破我的头骨。

答案 1 :(得分:1)

可能不正确,但是对于我的用例,我不想用整数替换值(根据公认的答案)。这是经过反复试验的繁杂结果,以及许多Django内部步骤。对我有用,但是YMMV:

{{1}}

答案 2 :(得分:0)

也许我不完全理解你的问题,但似乎你可以简化一点。使用ModelForms,我认为你的表单中没有任何覆盖_ init _的东西是必要的。试试这个,看看你是否得到了理想的行为。

models.py

class Module(models.Model):
    POST_TYPES = (
        ('blog', 'Blog'),
        ('portfolio', 'Portfolio'),
    )

    title        =   models.CharField(max_length=100, verbose_name='title')        
    entriesFrom  =   models.CharField(max_length=100, verbose_name='Pull content from', choices=POST_TYPES, blank=True)

    def __unicode__(self):
       return self.title

forms.py

class ModuleForm(forms.ModelForm):
    class Meta:
        model = Module

admin.py

from django.contrib import admin
admin.site.register(models.Module)

如果我的答案不是你想要的,请尝试澄清你的问题,我会看看能否帮助你。

答案 3 :(得分:0)

您可以使用此功能删除字符串标记

from ast import literal_eval

literal_eval(value)