Django Мастер форм - Использование набора форм изображения для связанной модели поста - PullRequest
0 голосов
/ 16 февраля 2020

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

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

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

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

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

models.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)

views.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()

forms.py

class PostCreateForm(forms.ModelForm):

    class Meta:
        model = Image 
        fields = '__all__'

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

1 Ответ

1 голос
/ 16 февраля 2020

Вы должны сохранять отдельные формы, когда вы * l oop через них:

if formset.is_valid():
    for form in formset:
        if form.is_valid():
            f = form.save(commit=False)
            f.post = post_id
            f.save()
...