Интерфейс администратора Django добавляет символы u "[] в список строк с SeparatedValuesField - PullRequest
2 голосов
/ 20 декабря 2011

Я использую SeparatedValuesField для отслеживания списка строк, как объяснено http://davidcramer.posterous.com/code/181/custom-fields-in-django.html, и многих постов здесь на SO, которые рекомендуют это как правильный способ хранения списка строк.

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

В моем приложении все работает нормально, я могу добавить идентификаторы устройств и просматривать их в интерфейсе администратора, как и ожидалось.

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']"]

Если я повторю этот процесс, просто нажав «Сохранить», а затем открою эту страницу сведений, она продолжит вложение фактического значения с символами «» [*].

Что я могу сделать, чтобы изменить эту функциональность? Должен ли я хранить список строк другим способом?

Ответы [ 2 ]

1 голос
/ 22 апреля 2014

Ответ Оивы Эсколы выглядит отлично (хотя я и не пробовал).

Найдя источник Django перед этим вопросом, я также наткнулся на следующее (что работает):

SeparatedValuesField(models.TextField):
    # ...

    def value_from_object(self, obj):
        return self.get_db_prep_value(super(SeparatedValuesField, self).value_from_object(obj))
1 голос
/ 03 июля 2012

У меня была точно такая же проблема, и я, наконец, понял ее благодаря этим двум разным ответам .

В этой ситуации вам нужен собственный виджет, который отображает список строк в виде строки. Этот виджет должен быть привязан к настраиваемому полю:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...