你会想要创建一个自定义小部件(我不知道内置小部件将完全按照你的需要)。最有用的例子可能是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