Просмотр Django отменяет то, чего достиг мой код - PullRequest
0 голосов
/ 26 сентября 2018

Моя модель:

Мое "событие" ссылается на несколько "элементов" в следующем объявлении:

items = models.ManyToManyField('Item')

Моя форма:

Есть много элементов, которые я перечисляю в виджете множественного выбора начальной загрузки.Чтобы сэкономить время, я добавил в форму флажок, который также добавит потомков выбранных «элементов» в мое «событие».

addToChildren = forms.BooleanField(required=False, label="Add event to descendants of selected item")

Мое представление:

После того как форма отправлена, я добавляю потомков со следующим кодом:

class EventUpdate(UpdateView):
    #declared model, formclass and success url, but left it off for the question

    def form_valid(self, form):
        event = form.save()
        if form.cleaned_data['addToChildren'] == True:  #add to children if told to do so.
            print("items before save")
            print(self.object.items.all())
            for x in range(0,form.cleaned_data['items'].count()):
                itm = form.cleaned_data['items'][x]
                for descendant in itm.get_descendants():
                    self.object.items.add(descendant)#deletes when updated
            print("items after save")
            print(self.object.items.all())
        return super(EventUpdate, self).form_valid(form)

Моя проблема:

Печатные операторы ясно показывают, чтопотомки выбранных элементов в добавляются в self.object (мой объект события).

Проблема в том, что оператор return игнорирует мои изменения, добавляет выбранные элементы в мое событие и удаляет все невыбранные элементы из моегособытие.Я бы хотел, чтобы это прекратилось.

Есть ли способ добавить информацию в form.cleaned_data из представления django?

1 Ответ

0 голосов
/ 26 сентября 2018

В вашем методе вы сохраняете объект, затем берете связанные экземпляры в поле items и добавляете их зависимости.Но когда вы вызываете супер метод, Django снова сохранит форму, включая многие связанные объекты, но не будет знать о добавленных вами, поэтому перезапишет их только выбранными.

Как правило, ваше желаемое поведение кажется немного странным, но вы можете сохранить его, вообще не вызывая метод super.Помимо сохранения, главное, что делает реализация по умолчанию, - это перенаправление на URL успеха.Итак, вы должны заменить этот супер-вызов строкой, которая делает это явно:

return HttpResponseRedirect(self.get_success_url())
...