【问题标题】:Django admin interface adds characters u"[ ] to a list of strings with SeparatedValuesFieldDjango 管理界面将字符 u"[ ] 添加到带有分界值字段的字符串列表中
【发布时间】:2012-01-23 23:37:46
【问题描述】:

正如http://davidcramer.posterous.com/code/181/custom-fields-in-django.html 所解释的那样,我正在使用separatedValuesField 来跟踪字符串列表,以及SO 上的许多帖子都推荐这是存储字符串列表的正确方法。

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

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

user_profile.device_ids = ['666666-D849-524F-6984-7E9B2D768546']

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

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

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

然后我更改我的 UserProfile 对象上的一些其他随机属性并使用内置的 django 管理界面保存按钮保存它。

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

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

如果我重复点击保存然后打开此详细信息页面的过程,它将继续使用 u"[ ] 字符嵌套实际值。

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

【问题讨论】:

    标签: python django csv django-admin


    【解决方案1】:

    我遇到了同样的问题,感谢这两个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
    

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

    如果您想用逗号空格value = ', '.join(str(v) for v in value)连接字符串,请记住strip()自定义字段的get_db_prep_value方法中的值。否则空间将被保存回数据库。

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

    class UserProfileAdmin(admin.ModelAdmin):
        form = UserProfileAdminForm
    
        list_display = ('ids_list',)
        def ids_list(self, obj):
            if obj.device_ids:
                return ', '.join(str(i) for i in obj.device_ids)
            return None
    

    【讨论】:

      【解决方案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))
      

      【讨论】:

      • 这对我有用,但我需要在 get_db_prep_value 中添加 connection=None
      猜你喜欢
      • 2014-06-25
      • 2023-03-07
      • 1970-01-01
      • 1970-01-01
      • 2017-11-26
      • 1970-01-01
      • 2018-06-03
      • 2018-06-22
      • 2012-07-24
      相关资源
      最近更新 更多