Мастер форм Django — использование набора форм изображений для связанной модели поста

Поэтому я использую мастер форм Django для разделения упрощенной формы PostForm. На одном из шагов посетители могут загружать различные изображения, связанные с публикацией.

В методе done для SessionWizardView я сначала сохраняю экземпляр, а затем проверяю изображения в наборе форм.

Однако я получаю следующее сообщение об ошибке;

save() запрещено, чтобы предотвратить потерю данных из-за несохраненного связанного объекта

Я попытался установить соответствующий идентификатор сообщения для набора форм, но мне здесь что-то не хватает, наборы форм по-прежнему являются чем-то, за чем я не могу следить. Любая помощь приветствуется!

модели.py

class Post(models.Model)
    title = models.CharField(max_length=200)
    description = models.TextField(max_length=1000)

    def __str__(self):
        return self.title 

class Image(models.Model):
    post = models.ForeignKey('Post', on_delete=models.SET_NULL, null=True)
    file = models.ImageField(upload_to='images/', null=True, blank=True)
    alt = models.CharField(max_length=200, blank=True)

просмотры.py

FORMS = [
    ('title', PostCreateForm),
    ('image', ImageFormset)
]

TEMPLATES = {
    'title': 'post_form_title.html',
    'image': 'post_form_image.html'
}

class PostWizardView(SessionWizardView):
    form_list = FORMS
    file_storage = FileSystemStorage(location=os.path.join(settings.MEDIA_ROOT, 'temp/'))

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

    def done(self, form_list, form_dict, **kwargs):
        instance = Post()

        for form in form_list:
            instance = construct_instance(form, instance)
        instance.save() 
        post_id = instance.pk

        if 'image' in form_dict:
            formset = form_dict['image']
            if formset.is_valid():
                formset.save(commit=False)
                for form in formset:
                    form.post = post_id
                    formset.save()

формы.py

class PostCreateForm(forms.ModelForm):

    class Meta:
        model = Image 
        fields = '__all__'

ImageFormset = inlineformset_factory(
    Post,
    Image,
    form = PostCreateForm,
    min_num=1,
    can_delete=True
)

person Kevin D.    schedule 16.02.2020    source источник


Ответы (1)


Вы должны сохранять отдельные формы по мере их прохождения:

if formset.is_valid():
    for form in formset:
        if form.is_valid():
            f = form.save(commit=False)
            f.post = post_id
            f.save()
person cwalvoort    schedule 16.02.2020
comment
Это спасло мое воскресенье! Мне нужно было только установить f.post на f.post.pk! Я обновлю исходный вопрос с правкой. Спасибо большое. - person Kevin D.; 16.02.2020