2

モデル Calendar があり、フォームでその複数のインスタンスを作成できるようにしたいと考えています。

ここに私のモデルがあります:

class Event(models.Model):
    user = models.ForeignKey(User)

class Group(models.Model):
    name = models.CharField(_('Name'), max_length=80)
    events = models.ManyToManyField(Event, through='Calendar')

class Calendar(models.Model):
    event = models.ForeignKey(Event)
    group = models.ForeignKey(Group)

class CalendarInline(admin.TabularInline):
    model = Calendar
    extra = 1

class GroupAdmin(admin.ModelAdmin):
    inlines = (CalendarInline,)

フォームをコーディングする方法は次のとおりです。

class AddEventToGroupForm(ModelForm):
    group = ModelMultipleChoiceField(queryset=Group.objects.all(), widget=SelectMultiple())

    def save(self):
        for g in self:
            g.save()

    class Meta:
        model = Calendar
        fields = ('group',)

そして、ここに私の見解の一部があります:

e = Event.objects.get(id=event_id)
calentry = Calendar(event=e)
if request.POST:
    f = AddEventToGroupForm(data=request.POST, instance=calentry)
    if f.is_valid():
        f.save()

そのフォームを送信しようとすると、次のようになります。

AttributeError at /groups/add_event/7/

'BoundField' object has no attribute 'save'

この状況でカレンダーの複数のインスタンスを作成する適切な方法は何ですか?

4

1 に答える 1

2

これは、フォームで多対多の関係を処理する方法ではありません。フォーム内のフィールドを繰り返し処理して保存することはできません。実際にはそのようには機能しません。

このフォームには、たまたま複数の値を持つフィールドが 1 つしかありません。ここで行うことは、このフィールドのcleaned_dataを反復処理することです。これは辞書で見つけることができます(フォームが有効な場合)。

したがって、あなたの見解では、次のようなことを行います。

if f.is_valid():
    for group in f.cleaned_data['group']:
        calentry.groups.add(group)

AddEventToGroupForm フォームをまったく「保存」していないことに注意してください。ModelForm 機能のいずれにも実際に依存していないため、ModelForm ではなく、標準の forms.Form にします。

于 2009-12-02T15:37:34.330 に答える