如何遍历 ModelMultipleChoiceField

How to iterate through ModelMultipleChoiceField

我的 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 数组,我无法在其上调用任何方法。

您不应将模型字段 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']