3

我无法在管理员的 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

表格.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)

管理员.py

class ModuleAdmin(admin.ModelAdmin):
    form = ModuleForm

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

编辑

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

4

4 回答 4

3

解决方案:

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

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

该死的,这不值得打破我的头骨。

于 2010-10-05T09:51:12.400 回答
2

可能不正确,但对于我的用例,我不想用整数替换值(根据接受的答案)。这是通过一点点的反复试验和大量的 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)
于 2020-02-04T15:13:25.890 回答
0

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

模型.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

表格.py

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

管理员.py

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

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

于 2010-10-04T21:34:38.070 回答
0

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

from ast import literal_eval

literal_eval(value)
于 2020-03-03T04:40:48.147 回答