Вопрос

У меня есть модель календаря, и в форме я хочу иметь возможность создавать несколько ее экземпляров.

Вот мои модели:

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'

Как правильный способ создать несколько экземпляров календаря в этой ситуации?

Это было полезно?

Решение

Это не то, как иметь дело с отношениями «многие ко многим» в формах.Вы не можете перебирать поля формы и сохранять их, это действительно не работает.

В этой форме есть только одно поле, которое имеет несколько значений.Здесь нужно перебрать ценности этого поля, которое вы найдете в cleaned_data словарь (когда форма действительна).

Итак, на ваш взгляд, вы делаете что-то вроде:

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

Обратите внимание, что вы вообще не «сохраняете» форму AddEventToGroupForm.Я бы сделал это стандартной формой form.Form, а не ModelForm, поскольку вы на самом деле не зависите от каких-либо функций ModelForm.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top