【问题标题】:Django: MultipleChoiceField in admin to carry over previously saved valuesDjango:管理员中的 MultipleChoiceField 以结转以前保存的值
【发布时间】:2011-04-20 20:20:39
【问题描述】:

我无法在管理员的 ModelForm 中结转之前选择的项目。 我想使用 forms.CheckboxSelectMultiple 小部件,因为这是此用例中最直接的 UI。它的工作原理是在保存时存储值。但是在编辑之前保存的项目时,之前保存在该字段中的值不会反映在小部件中。

用户界面示例:

发布后(编辑该项目,返回空白):

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

那么由于某种原因,复选框小部件没有表示这些值?

这是我的简化设置,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

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

编辑

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

【问题讨论】:

    标签: django admin modelform


    【解决方案1】:

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

    models.py

    类模块(模型。模型): POST_TYPES = ( ('博客', '博客'), ('投资组合','投资组合'), ) title = models.CharField(max_length=100, verbose_name='title') entryFrom = models.CharField(max_length=100,verbose_name='从'拉取内容',choices=POST_TYPES,blank=True) def __unicode__(self): 返回self.title

    forms.py

    类 ModuleForm(forms.ModelForm): 元类: 型号 = 模块

    admin.py

    从 django.contrib 导入管理员 admin.site.register(models.Module)

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

    【讨论】:

    • 对于 entriesFrom 字段,我想使用 forms.CheckboxSelectMultiple 小部件,因为这是此用例中最直接的 UI。它的工作原理是保存值,但是当返回到以前保存的项目时,以前保存在复选框中的值不会显示。
    【解决方案2】:

    解决方案:

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

    POST_TYPES = (
        (1,     'Blog'),
        (2,     'Portfolio'),
        (3,     'Beeldbank'),
    )
    

    该死,这不值得我折断我的头骨。

    【讨论】:

      【解决方案3】:

      可能不正确,但对于我的用例,我不想用整数替换值(根据接受的答案)。这是通过一点点的反复试验和大量的 Django 内部结构来实现的。对我有用,但 YMMV:

      from django.forms.widgets import (
          CheckboxSelectMultiple as OriginalCheckboxSelectMultiple,
      )
      
      class CheckboxSelectMultiple(OriginalCheckboxSelectMultiple):
          def optgroups(self, name, value, attrs=None):
              # values come back as e.g. `['foo,bar']`, which we don't want when inferring "selected"
              return super().optgroups(name, value[0].split(","), attrs)
      

      【讨论】:

      • 这非常适用于存储字符串的 ArrayField。我花了几个小时试图弄清楚这一点,这救了我。谢谢!
      【解决方案4】:

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

      from ast import literal_eval
      
      literal_eval(value)
      

      【讨论】:

        猜你喜欢
        • 2013-04-03
        • 2019-07-09
        • 1970-01-01
        • 2021-08-03
        • 2015-12-17
        • 1970-01-01
        • 2011-03-30
        • 2018-12-14
        • 2011-06-01
        相关资源
        最近更新 更多