2011-12-19 6 views
2

私はSeparatedValuesFieldを使って文字列リストを保存しています。http://davidcramer.posterous.com/code/181/custom-fields-in-django.htmlで説明されています。それは私のアプリケーションで正常に動作しているDjangoの管理インターフェースは、文字列リストに文字列 ""を追加しました。

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の管理インターフェイスの保存ボタンを使用しています。

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

私は、この詳細ページを開く保存打つのこのプロセスを繰り返した場合、それがされます:私は私のオブジェクトのために再度のUserProfileオブジェクトの詳細ページを開くと、その値は次のようになります

U "[]の文字と実際の値を入れ子続ける。

は私が別の方法で文字列のリストを格納する必要がありますか。この機能を変更するために行うことができます何かありますか?

答えて

1

を私はまったく同じ問題を抱えていました、そして最後にそれを考え出したこの2つのおかげで、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方法で値を覚えて、コンマスペースvalue = ', '.join(str(v) for v in 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 
1

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)) 
+0

は、これは私のために働いたが、私はget_db_prep_value' 'で'接続= NONE'を追加する必要が – AverageMarcus

関連する問題