【问题标题】:How to iterate through ModelMultipleChoiceField如何遍历 ModelMultipleChoiceField
【发布时间】:2015-11-18 20:54:13
【问题描述】:

我的 modelforms.py 看起来像:

class ChangeEventTimeForm(forms.ModelForm):

def __init__(self, *args, **kwargs):
    super(ChangeEventTimeForm, self).__init__(*args, **kwargs)
    events = Event.objects.values

    self.fields['map_area'] = forms.ModelChoiceField(queryset=MapArea.objects.all(), required=False)
    self.fields['event'] = forms.ModelMultipleChoiceField(queryset=Event.objects.all(), required=False, widget=forms.CheckboxSelectMultiple())

class Meta:
    model = ChangeEventTime
    fields = ('map_area', 'time_map', 'event', 'time_event', )

在我的 models.py 中有:

event = models.CharField(
    max_length=2000, default=None, blank=True,
)

def save(self, *args, **kwargs):

    print self.event

    if len(self.time_event.__str__()) > 0:
        for obj in self.event:
            print obj

问题是我无法遍历 self.event。 print obj 的输出是:

[

E

v

e

n

t

一个

d

s

一个

d

>

,

E

v

e

n

t

r

e

k

>

]

我需要的是访问这两个对象并获得一些变量。怎么做?我浪费了一整天,不知道该怎么办。它看起来是一种 unicode 数组,我不能在上面调用任何方法。

【问题讨论】:

  • 显然self.event 是一个字符串。请显示所有模型类的完整定义

标签: python django python-unicode


【解决方案1】:

您不应该将模型字段 event 定义为 models.CharField,它应该与您在表单中尝试执行的操作相匹配。您需要将其更改为

events = models.ManyToManyField(Event)

一般来说,您不应该依赖覆盖 save() 来实现您想要的,该方法有很多问题,因此可能会导致问题。我建议改为检查表格:

# in your views.py
form = ChangeEventTimeForm(request.POST)
if form.is_valid():
    # here you would have all events in the form
    checked_events = form.cleaned_data['event']

【讨论】:

  • 我之前尝试过,但后来我遇到了另一个问题,因为 m2m 关系是在调用 save 之后创建的。我试过 post_save 信号来获取 self.event 但没有运气。通常我不保存 ChangeEventTimeForm 实例。我需要确定复选框用户选择了哪些事件,然后做我知道如何做的其他事情。
猜你喜欢
  • 2011-04-09
  • 2010-12-18
  • 2017-01-10
  • 2011-12-21
  • 2012-02-27
  • 2016-11-23
  • 2017-03-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多