我在管理员的模型中隐藏以前选择的项目时遇到了麻烦。 我想使用 forms.CheckboxSelectMultiple 小部件,因为这是此用例中最直接的UI。它的工作原理是保存时,存储值。但是,在编辑以前保存的项目时,先前保存在此字段中的值不会反映在窗口小部件中。
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
因此,在编辑之前保存的项目并选择“blog”时,在 init 上调试会在self.fields ['entriesFrom']([u'blog',])上返回正确的值,但它没有反映在管理员的复选框中(没有显示为选中)。
修改的
更新了ModuleForm类以传递初始值,但是在初始值中有一些值(“[u'blog']”)时,没有任何内容仍然预先填充。
答案 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)