Django Мастер форм - Как сохранить выбранные элементы в поле «многие ко многим» - PullRequest
0 голосов
/ 09 февраля 2020

Итак, я разделил форму на два этапа, используя мастер форм Django formtools. Форма работает, данные сохраняются, за исключением множества полей.

Пользователи могут создавать объявления, которые можно фильтровать по тегам. Модель тегов связана с моделью объявления через множество полей, однако при сохранении формы выбранные теги не сохраняются в модели объявления.

models.py

class Ad(models.Model):
    title = models.CharField(max_length=200)
    description = RichTextField()
    tags = models.ManyToManyField('Tag')

class Tag(models.Model):
    name = models.CharField(max_length=200)

просмотров. py

FORMS = [
    ('title', AdCreateFormStepOne),
    ('tags', AdCreateFormStepTwo),
]

TEMPLATES = {
    'title': 'grid/ad_form_title.html',
    'tags': 'grid/ad_form_tags.html',
}

class AdWizardView(SessionWizardView):
    form_list = FORMS

    def get_template_names(self):
        return [TEMPLATES[self.steps.current]]

    def done(self, form_list, **kwargs):
        instance = Ad()
        for form in form_list:
            instance = construct_instance(form, instance, form._meta.fields, form._meta.exclude)
        instance.save()
        # After the instance is saved we need to set the tags 
        instance.tags.set(form.cleaned_data['tags'])

        return redirect('index')

Так что, я думаю, мне все еще приходится обрабатывать множество отношений в методе done для AdWizardView. Я видел ответ на следующий вопрос , но решение выдает ошибку ...

Объект 'odict_values' не поддерживает индексирование

Кто-нибудь знает что мне здесь не хватает?

С наилучшими пожеланиями,

Редактировать: Просто для пояснения, объект в модели Tag уже существует, выбранный с помощью виджета CheckboxSelectMultiple () в формах.

1 Ответ

0 голосов
/ 10 февраля 2020

Хорошо! получил это!

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

views.py

def done(self, form_list, **kwargs):
    form_data = [form.cleaned_data for form in form_list]
    instance = Ad()
        for form in form_list:
        instance = construct_instance(form, instance, form._meta.fields, form._meta.exclude)
    instance.save()
    # Select the tags from the form data and set the related tags after the instance is saved 
    instance.tags.set(form_data[1]['tags'])

    return redirect('index')
...