カスタム ウィジェットを作成することをお勧めします (希望どおりの機能を備えた組み込みウィジェットは知りません)。最も有用な例は、おそらく Django に付属するウィジェット (forms/widgets.py にあります) でしょう。カスタム ウィジェットの作成例もここで見ることができます。
私は少しいじって、組み込みのウィジェットを適応させた後、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