2011-02-10 26 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