2014-01-23 65 views
1

請幫我在使用表單使用訪問在Django模板的M2M字段值形式

我的模型訪問模板中的M2M值:

class Opportunity(models.Model): 
    sfdc_id = models.PositiveIntegerField(null=True, blank=True) 

class Event(models.Model): 
    background = models.TextField(null=True, blank=True) 
    account = models.ForeignKey(Account) 
    opportunities = models.ManyToManyField(Opportunity, null=True, blank=True) 

Views.py

def event(request,event_id): 
    if request.method == 'GET' : 
     eventForm=EventForm(instance=Event.objects.get(pk=event_id)) 
     locationForm = LocationForm(prefix='location') 
     return render(request,'events/event.html', {'eventForm': eventForm, 'locationForm': locationForm}) 

更新模型形式:

class EventForm(ModelForm): 
    account = ModelChoiceField(queryset=Account.objects.all()) 
    background = CharField(widget=Textarea(attrs={'class':'form-textarea resizeoff auto-resize js_auto_resize default'}), required=False) 
    opportunities = CharField(label='SalesForce ID', widget=TextInput(attrs={'class' : 'form-input'}), required=False) 

在我的模板我曾嘗試下面的代碼,但不工作

{% for attr in eventForm.opportunities.all %} 
     <td>{{ attr.sfdc_id }}</td> 
{% endfor %} 

我已經嘗試這樣做,仍然沒有工作

{% for attr in eventForm.opportunities_set.all %} 
     <td>{{ attr.sfdc_id }}</td> 
{% endfor %} 

請幫幫我!

+0

你應該向我們展示EventForm和LocationForm的定義 – Alvaro

+0

我已經更新了模型表單,請看看@Alvaro – user4k

回答

0

在您的形式,機會的定義修改爲:

class EventForm(ModelForm): 
    account = ModelChoiceField(queryset=Account.objects.all()) 
    background = CharField(widget=Textarea(attrs={'class':'form-textarea resizeoff auto-resize js_auto_resize default'}), required=False) 
    opportunities = ModelMultipleChoiceField(queryset=Opportinuty.objects.all(), label='SalesForce ID', required=False) 

文檔here

這將呈現一個適當的M2M表單控件。 如果您希望將控件更換爲更可用的一個,我建議在看django-selectable

它有一個很好AutocomboboxSelectMultipleWidget,我覺得非常有用的(和漂亮!)

+0

我想把機會欄作爲文本框,因爲需要的是用戶可以輸入新的機會值同時編輯事件表單。 – user4k

+0

我向您展示的小部件可讓您隨時添加新值,但如果您想使用文本字段,則需要手動處理表單 – Alvaro

+0

是的,我正在手動處理這些值,以下是我正在執行的代碼手動處理。 http://dpaste.com/hold/1566046/ – user4k

1
opportunities = ModelMultipleChoiceField(widget=SelectMultiple(attrs={'class' : 'form-input'}),queryset=Opportinuty.objects.all(), label='SalesForce ID', required=False) 

...