Не удается сохранить набор форм с файлами, используя Django и CrispyForm - PullRequest
0 голосов
/ 10 марта 2020

Я пытаюсь использовать crispyforms с набором форм, чтобы я мог позволить людям загружать несколько файлов в отдельных полях формы. Однако я не могу сохранить свою модель CampaignFile для сохранения. Он прекрасно сохраняет модель Campaign, но сохраняет ее с пустым полем CampaignFile вместо загруженного файла.

models.py

class Campaign(models.Model):
    """A typical class defining a model, derived from the Model class."""

    # Fields
    company = models.CharField(max_length=32)
    email = models.EmailField(help_text='This is where we will send your results')
    pub_date = models.DateTimeField('date_published', auto_now_add=True)

    # Metadata
    class Meta:
        ordering = ['company', '-pub_date']

    # # Methods
    # def get_absolute_url(self):
    #     """Returns the url to access a particular instance of MyModelName."""
    #     return reverse('model-detail-view', args=[str(self.id)])

    def __str__(self):
        """String for representing the MyModelName object (in Admin site etc.)."""
        return f'{self.id}'

class CampaignFile(models.Model):
    content = models.FileField(
        validators=[validate_file_type],
        upload_to='ad_testing_form/')
    campaign = models.ForeignKey(Campaign, on_delete=models.CASCADE, related_name='campaign')

forms.py

class CampaignFileForm(forms.ModelForm):
    class Meta:
        model = CampaignFile
        exclude = ()
        widgets = {
            'content': forms.ClearableFileInput(attrs={'multiple': False})
        }


CampaignFileFormSet = inlineformset_factory(
    Campaign, CampaignFile, form=CampaignFileForm,
    fields=['content'], extra=1, can_delete=True, labels={'content': 'Add Image/Video'}
)

class CampaignForm(forms.ModelForm):
    class Meta:
        model = Campaign
        exclude = ['pub_date', ]

    def __init__(self, *args, **kwargs):
        super(CampaignForm, self).__init__(*args, **kwargs)
        self.helper = FormHelper()
        self.helper.form_tag = True
        self.helper.form_enctype = "multipart/form-data"
        self.helper.form_class = 'form-horizontal'
        self.helper.label_class = 'col-md-3 create-label'
        self.helper.field_class = 'col-md-9'
        self.helper.layout = Layout(
            Div(
                Field('company'),
                Field('email'),
                Fieldset('Add content',
                         Formset('content')),
                HTML("<br>"),
                ButtonHolder(Submit('submit', 'Save')),
            )
        )

Представления 1018 *

class Formset(LayoutObject):
    template = "ad_testing_form/campaign_file_formset.html"

    def __init__(self, formset_name_in_context, template=None):
        self.formset_name_in_context = formset_name_in_context
        self.fields = []
        if template:
            self.template = template

    def render(self, form, form_style, context, template_pack=TEMPLATE_PACK):
        formset = context[self.formset_name_in_context]
        return render_to_string(self.template, {'formset': formset})
...