come posso salvare un modulo con ModelMultipleChoiceField?
-
11-09-2019 - |
Domanda
Ho un modello del calendario e in una forma che voglio essere in grado di creare più istanze di esso.
Qui sono i miei modelli:
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,)
Ecco come provo a codificare la mia 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 qui è una parte del mio punto di 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 provo a inviare quella forma, ottengo:
AttributeError at /groups/add_event/7/
'BoundField' object has no attribute 'save'
Qual è il modo corretto di creare più istanze di calendario in questo situazione?
Soluzione
Non è come trattare con molti-a-molti in forme. Non è possibile scorrere i campi in un modulo e salvarli, in realtà non funziona in questo modo.
In questa forma, c'è solo un campo, che succede ad avere più valori. La cosa da fare è quello di scorrere i valori di questo campo, che troverai nel dizionario cleaned_data
(quando il modulo è valido).
Quindi, secondo lei, si fa qualcosa di simile:
if f.is_valid():
for group in f.cleaned_data['group']:
calentry.groups.add(group)
Si noti che non stai 'salvare' la forma AddEventToGroupForm a tutti. Vorrei fare un FORMATI.FORM standard, piuttosto che un ModelForm, come non sei davvero a seconda nessuna delle funzionalità ModelForm.