2011-02-10 24 views
2

我有一个模型,其中包含一个ManyToMany字段以表“标签”。由于这个表格可能很大,我不想在表单中显示一个选择,而是由charfield提供的昏迷分隔列表(我猜想)。在ModelForm上显示Charfield中ManyToMany项目的逗号分隔列表

关于保存,我会用逗号分割列表,然后逐个添加它们(使用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)) 

注意,在这个例子中,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 
+0

是啊,当然,感谢您的答复),我会寻找这个实施我会验证它:) – 2011-02-10 18:03:42