Невозможно отправить данные из формы модели с несколькими файлами django
Я пытаюсь добавить несколько файлов с помощью двух моделей и форм. Пытался обновить, но не смог заставить это работать. При отправке формы ошибок нет, но в базу данных ничего не отправляется.
Помогите, пожалуйста.
Также, как определить пользователей как полное имя в выпадающих списках в формах? Пробовал подход с полями форм, но не работает. Также форма не показывает пустую метку
models.py
class Case(models.Model):
client = models.ForeignKey(Client, on_delete=models.CASCADE, related_name= 'caseclients' )
statute = models.ForeignKey(Statute, on_delete=models.CASCADE)
financial_year = models.ForeignKey(Financialyear, on_delete=models.CASCADE)
proceeding = models.ForeignKey(Proceeding, on_delete=models.CASCADE)
case_title = models.CharField(max_length=200)
initiated_on = models.DateField(auto_now=False, auto_now_add=False)
communication_received_on = models.DateField(auto_now=False, auto_now_add=False)
first_date_of_hearing = models.DateField(auto_now=False, auto_now_add=False)
limitation_period = models.CharField(max_length=500, blank=True)
amount_involved = models.IntegerField(null=True,blank=True)
person_responsible = models.ForeignKey(User, on_delete=CASCADE, related_name = 'person_responsible')
assisted_by = models.ManyToManyField(User, related_name = 'assisted_by', blank=True)
brief_of_case = models.TextField(max_length=1000)
status = models.CharField(choices=[('Open','Open'),('Close','Close')],default='Open', max_length=100)
def __str__(self):
return self.case_title
class CaseFiles(models.Model):
attachment = models.FileField(upload_to='casefiles/')
case = models.ForeignKey(Case, on_delete=models.CASCADE, related_name= 'casefiles')
forms.py
class CaseFilesCreationForm(ModelForm):
class Meta:
model = CaseFiles
fields = ['attachment']
attachment = forms.FileField,
widgets= {
'attachment': forms.ClearableFileInput(attrs={'multiple': True, 'class': 'form-control form-control-light','type': 'file',}),
}
class CaseCreationForm(ModelForm):
class Meta:
model = Case
fields = '__all__'
client = forms.ModelChoiceField(queryset=Client.objects.all(), to_field_name="name_of_client", empty_label="Select Client",),
statute = forms.ModelChoiceField(queryset=Statute.objects.all(), to_field_name="statute", empty_label="Select Statute",),
financial_year = forms.ModelChoiceField(queryset=Financialyear.objects.all(), to_field_name="financialyear", empty_label="Select Financial Year",),
proceeding = forms.ModelChoiceField(queryset=Proceeding.objects.all(), to_field_name="proceeding", empty_label="Select Proceeding",),
person_responsible = UserModelChoiceField(queryset=User.objects.all(),to_field_name="first_name"),
assisted_by = UserModelMultipleChoiceField(queryset=User.objects.all(),to_field_name="first_name"),
widgets= {
'client': forms.Select(attrs={'class': 'form-select form-select-light',}),
'statute': forms.Select(attrs={'class': 'form-select form-select-light',}),
'financial_year': forms.Select(attrs={'class': 'form-select form-select-light',}),
'proceeding': forms.Select(attrs={'class': 'form-select form-select-light',}),
'case_title': forms.TextInput(attrs={'class': 'form-control form-control-light',}),
'initiated_on': forms.DateInput(attrs={'class': 'form-control form-control-light', 'type': 'date',}),
'communication_received_on': forms.DateInput(attrs={'class': 'form-control form-control-light', 'type': 'date',}),
'first_date_of_hearing': forms.DateInput(attrs={'class': 'form-control form-control-light', 'type': 'date',}),
'limitation_period': forms.TextInput(attrs={'class': 'form-control form-control-light',}),
'amount_involved': forms.NumberInput(attrs={'class': 'form-control form-control-light',}),
'person_responsible': forms.Select(attrs={'class': 'form-select form-select-light',}),
'assisted_by': forms.Select(attrs={'class': 'select2 form-control select2-multiple form-select-light', 'data-toggle': 'select2', 'multiple': True}),
'brief_of_case': forms.Textarea(attrs={'class': 'form-control form-control-light', 'rows':4}),
'status': forms.Select(attrs={'class': 'form-control form-control-light',}),
}
views.py
def createcase(request):
if request.method == 'POST':
form = CaseCreationForm(request.POST)
file_form = CaseFilesCreationForm(request.POST, request.FILES)
files = request.FILES.getlist('attachment')
if form.is_valid() and file_form.is_valid():
case_instance = form.save()
case_instance.save()
for f in files:
file_instance = CaseFiles(attachment=f, case=case_instance)
file_instance.save()
else:
form = CaseCreationForm()
file_form = CaseFilesCreationForm()
return render(request, 'cases/createcase.html',{'form':form, 'file_form':file_form})
Попробуйте изменить свой код на этот. Честно говоря, я не понимаю, что вы пытались там сделать, но вы выполнили кучу операций без сохранения форм. Так что... стоит попробовать.
def createcase(request):
if request.method == 'POST':
form = CaseCreationForm(request.POST)
file_form = CaseFilesCreationForm(request.POST, request.FILES)
files = request.FILES.getlist('attachment')
if form.is_valid() and file_form.is_valid():
form.save()
file_form.save()
else:
form = CaseCreationForm()
file_form = CaseFilesCreationForm()
return render(request, 'cases/createcase.html',{'form':form, 'file_form':file_form})
Также вы хотите убедиться, что в вашем html ваша форма выглядит следующим образом:
<form action="" method="post" enctype="multipart/form-data">