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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top