Django管理接口将字符u“[]添加到具有分隔值字段的字符串列表中

2024-09-27 17:30:18 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用SeparatedValuesField来跟踪由http://davidcramer.posterous.com/code/181/custom-fields-in-django.html解释的字符串列表,以及这里的许多文章,因此建议将此作为存储字符串列表的正确方法。在

class UserProfile(models.Model):
    user = models.OneToOneField(User)
    device_ids = SeparatedValuesField(blank=True, null=True, default=[])

它在我的应用程序中运行良好,我可以添加设备ID,并按预期在管理界面中查看它们。在

^{pr2}$

但问题在于管理接口,当我打开UserProfile对象的详细信息页面时,管理接口本身正在向我的device_ids字段添加额外的值。在

例如,我的应用程序在字段中插入一个值,当我在管理界面中查看它时,它看起来像这样:

[u'666666-D849-524F-6984-7E9B2D768546']

然后,我更改了UserProfile对象的一些其他随机属性,并使用内置的django管理接口save按钮保存它。在

当我再次打开对象的UserProfile对象详细信息页面时,该值现在如下所示:

[u"[u'666666-D849-524F-6984-7E9B2D768546']"]

如果我重复这个过程,只点击save然后打开这个详细信息页面,它将继续用u“[]字符嵌套实际值。在

我能做些什么来改变这个功能吗?我应该以不同的方式存储字符串列表吗?在


Tags: 对象django字符串true应用程序ids列表界面
2条回答

Oiva Eskola的答案看起来不错(不过还没试过)。在

在这个问题之前找到Django源代码,我还偶然发现了以下内容(有效):

SeparatedValuesField(models.TextField):
    # ...

    def value_from_object(self, obj):
        return self.get_db_prep_value(super(SeparatedValuesField, self).value_from_object(obj))

我也遇到了同样的问题,最后由于这两个differentanswers才解决了。在

在这种情况下,您需要的是一个自定义小部件,它将字符串列表呈现为字符串。此小部件需要绑定到自定义字段:

class FlattenListWidget(forms.TextInput):
    def render(self, name, value, attrs=None):
        if not value is None:
            value = ','.join(str(v) for v in value)
        return super(FlattenListWidget, self).render(name, value, attrs)

class UserProfileAdminForm(forms.ModelForm):
    class Meta:
        model = UserModel
        widgets = {
            'device_ids': FlattenListWidget(),
        }

class UserProfileAdmin(admin.ModelAdmin):
    form = UserProfileAdminForm

希望能奏效。我的代码中有不同的模型名,但我设法从我的自定义字段中获得一个包含逗号分隔的值列表的文本输入。在

如果要用逗号和空格连接字符串,请记住strip()自定义字段的get_db_prep_value方法中的值。否则,这些空间将被保存回数据库。在

要使用list_display中的自定义字段,可以向管理模型添加自定义字段:

^{pr2}$

相关问题 更多 >

    热门问题