Я пытаюсь использовать 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})