Como posso salvar um formulário com ModelMultipleChoiceField?
-
11-09-2019 - |
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?
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.