你會想要創建一個自定義小部件(我不知道內置小部件將完全按照你的需要)。最有用的例子可能是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))
注意,在這個例子中,widget被硬編碼使用一個假設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
是啊,當然,感謝您的答覆),我會尋找這個實施我會驗證它:) – 2011-02-10 18:03:42