【问题标题】:Accessing a m2m field values in django templates using forms使用表单访问 django 模板中的 m2m 字段值
【发布时间】:2014-01-23 13:55:28
【问题描述】:

请帮助我使用表单访问模板中的 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 %}

请帮帮我!!!

【问题讨论】:

  • 你应该告诉我们EventForm和LocationForm的定义
  • 我已经更新了模型表格,请看@Alvaro

标签: python django django-forms django-templates


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

...

【讨论】:

    【解决方案2】:

    在您的表单中,将机会的定义更改为:

    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,我觉得它非常有用(而且很好!)

    【讨论】:

    • 我想将机会字段保留为文本框,因为需要用户可以在编辑事件表单时为机会输入新值。
    • 我向您展示的小部件可让您即时添加新值,但如果您想使用文本字段,则需要手动处理表单
    • 是的,我正在手动处理这些值,这是我进行手动处理的代码。 dpaste.com/hold/1566046
    • 然后我会添加一个上下文变量:opportunity_list = chance.split(',') ;并手动渲染
    • @Alvaro 正如您所建议的那样,我已将视图中的机会列表作为上下文变量传递并在模板中手动呈现!
    猜你喜欢
    • 2020-03-30
    • 1970-01-01
    • 2012-06-05
    • 2012-11-08
    • 2011-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-13
    相关资源
    最近更新 更多