2014-01-23 62 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) 

...