2011-02-10 10 views
2

テーブル「Tags」にManyToManyフィールドを含むモデルがあります。この表は膨大なものになる可能性があるので、フォームに選択を表示するのではなく、チャーフィールド(私が想定している)によって提供されるタグの昏睡区切りリストを表示したいと思います。ManyToMany項目のカンマ区切りリストをModelFormのCharfieldに表示します

保存時に、リストをコンマで区切り、1つずつ(get_or_createを使用して)追加します。私はすでにそれをしました。

しかし、私はデータを変更したいとき、タグのリストを持つ代わりにIDのリストを持っています。

コンマ区切りタグのリストを表示するにはどうすればよいですか?私はそれのための新しい特定のフィールドを作成する必要がありますか?または私が探しているものを行う何かが既にあるのですか?

ありがとうございました!

答えて

3

あなたはカスタムウィジェットを作成したいと思うでしょう(私は、あなたが望むものを正確に行う組み込みのウ​​ィジェットを認識していません)。最も有益な例はおそらくDjangoに付属しているウィジェット(forms/widgets.py内)です。また、カスタムウィジェットの作成例を見ることができますhere

私はちょっと手を加えましたが、組み込みのInputウィジェットを適用した後、これは私が思いついたものです。私はいくつかのテストを行なったし、それが私の作品:

class CommaTags(Widget): 
    def render(self, name, value, attrs=None): 
     final_attrs = self.build_attrs(attrs, type='text', name=name) 
     objects = [] 
     for each in value: 
      try: 
       object = Tag.objects.get(pk=each) 
      except: 
       continue 
      objects.append(object) 

     values = [] 
     for each in objects: 
      values.append(str(each)) 
     value = ', '.join(values) 
     if value: # only add 'value' if it's nonempty 
      final_attrs['value'] = force_unicode(value) 
     return mark_safe(u'<input%s />' % flatatt(final_attrs)) 

(注)この例では、ウィジェットは架空のTagモデルを使用するようにハードコードされており、それだけに表示されますどのよう各オブジェクトのstr()方法を使っていることカンマで区切られたリストおそらくあなたの用途に合わせてこれらを変更したいと思うでしょう。また、私はこれをforms/widgets.pyに直接持っていました。もしあなたがおそらくそうであるように他の場所に置くなら、私が使ったことのいくつかをインポートする必要があります。

作成し、あなたがそうのように、自分のフォームでごModelMultipleChoiceFieldためのウィジェットとしてそれを指定することができたら:もちろん

from django import forms 

class TagForm(forms.ModelForm): 
    tags = forms.ModelMultipleChoiceField(queryset=Tag.objects.all(), 
              widget=CommaTags) 
    class Meta: 
     model = Tag 
+0

うん;)返信用のおかげで、私はこの実装のために見ていきます私はそれを検証するでしょう:) –

+0

さて、私は少し私の答えを更新し、現在の作業例が含まれています。私はこれが助けて欲しい! – mjjohnson

+2

あなたの最終的なコードです:http://python.pastebin.com/uvPL8Aat。どうもありがとうございました! –

関連する問題