Pergunta

Eu tenho um modelo de calendário e de uma forma que eu quero ser capaz de criar várias instâncias do mesmo.

Aqui estão os meus modelos:

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,)

Aqui está como eu tento código minha forma:

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 aqui é uma parte do meu ponto de vista:

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()

Se eu tentar enviar essa forma, eu recebo:

AttributeError at /groups/add_event/7/

'BoundField' object has no attribute 'save'

O que é a maneira correta de criar várias instâncias de Calendar neste situação?

Foi útil?

Solução

Isso não é como lidar com muitos-para-muitos relacionamentos em formas. Você pode não iterate através de campos em um formulário e salvá-los, ele realmente não funciona dessa forma.

Nesta forma, há apenas um campo, que passa a ter vários valores. A coisa a fazer aqui é para percorrer o valores deste campo, onde você vai encontrar no dicionário cleaned_data (quando o formulário é válido).

Então, na sua opinião, você fazer algo como:

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

Observe que você não é 'salvar' a forma AddEventToGroupForm em tudo. Eu faria uma forms.Form padrão, em vez de um ModelForm, como você não está realmente dependendo qualquer uma das funcionalidades ModelForm.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top