Описание проблемы:
У меня есть представление django и шаблон, который отображает несколько абзацев данных, которые извлекаются из модели.Ниже каждого тега <input type="file">
для загрузки изображений, связанных с каждой строкой данных.Когда пользователь загружает файлы, он может загружать от 1 до нескольких файлов для одной конкретной строки модели или может не загружать файлы для одной или нескольких моделей.Мне нужно сохранить эти файлы с внешним ключом в эту строку.Для этого я не использую формы django.
Чтобы еще раз объяснить, в моем html есть несколько файловых тегов, каждый из которых находится под определенным набором текста из разных строк модели.На POST все файлы объединяются в список внутри request.FILES, без понятия о том, из какого входного тега загружен каждый из них.Мне нужно различать файлы, загруженные из разных файловых тегов, так как они должны быть сохранены в модели, ссылаясь на разные строки по внешнему ключу. Как узнать, из какого тега ввода был загружен конкретный файл в запросе. ФАЙЛЫ были загружены?
Моя модель:
class Procedure(models.Model):
procid = models.AutoField(primary_key=True, unique=True)
timestr = models.DateTimeField(default=timezone.now)
template = models.ForeignKey(ProcedureTemplate, on_delete=models.CASCADE, blank=True, null=True)
clinic = models.ForeignKey(Clinic, on_delete=models.CASCADE)
doctor = models.ForeignKey(doctor, on_delete=models.SET_NULL, blank=True, null=True)
customer = models.ForeignKey(customer, on_delete=models.CASCADE, null=False)
def __str__(self):
return f'{self.template} for {self.customer} on {self.timestr}'
class SectionHeading(models.Model):
procid = models.AutoField(primary_key=True, unique=True)
name = models.CharField(max_length=200)
fieldtype_choice = (
('heading1', 'Heading1'),
('heading2', 'Heading2'),
)
fieldtype = models.CharField(
choices=fieldtype_choice, max_length=100, default='heading1')
template = models.ForeignKey(ProcedureTemplate, on_delete=models.CASCADE, null=False)
def __str__(self):
return f'{self.name} [{self.procid}]'
class SectionText(models.Model):
procid = models.AutoField(primary_key=True, unique=True)
name = models.CharField(max_length=200)
widgettype_choice = (
('textarea', 'Textarea'),
('text', 'Short Text'),
)
widgettype = models.CharField(
choices=widgettype_choice, max_length=100, default='text')
heading = models.ForeignKey(SectionHeading, on_delete=models.CASCADE, null=False)
def __str__(self):
return f'{self.name} [{self.procid}]'
class SectionImage(models.Model):
procid = models.AutoField(primary_key=True, unique=True)
pic = StdImageField(upload_to="data/media/%Y/%m/%d", blank=True, variations={
'large': (600, 400),
'thumbnail': (150, 140, True),
'medium': (300, 200),
})
procedure = models.ForeignKey(Procedure, on_delete=models.CASCADE, null=False)
def __str__(self):
return self.pic.url
Мой вид:
if request.method == 'POST':
print(request.POST, "\n\n")
headinglist = request.POST.getlist('qn[]')
valuelist = request.POST.getlist('ans[]')
for h, v in zip(headinglist, valuelist):
print(h, v)
print(request.FILES)
filelist = request.FILES.getlist('uploaded[]')
for f in filelist:
print(f)
report_pic = SectionImage(pic = f, procedure=proc)
report_pic.save()
print(f'Saved picture to disk: {f}')
msg = "Updated successfully"
Мой HTML:
{% for qn, ans in headingparagraph %}
<div class="row mt-4">
<div class="col-md-24">
<div class="form-group">
<label for="exampleFormControlTextarea1">{{ qn.name }}</label>
<input type="hidden" id="custId" name="qn[]" value="{{ qn.procid }}">
<textarea class="form-control reporttextarea" id="" rows="3" name="ans[]">{{ ans }}</textarea>
</div>
</div>
</div>
<div class="row mb-2">
<i class="fas fa-image fa-2x mx-2"></i> Upload Images <input type="file" class="mx-2" id="{{ qn.procid }}_upload" accept="image/*" name="uploaded[]" multiple />
</div>
{% endfor %}
Это отображается как:
<div class="row mt-4">
<div class="col-md-24">
<div class="form-group">
<label for="exampleFormControlTextarea1">Nasal mucosa</label>
<input type="hidden" id="custId" name="qn[]" value="1">
<textarea class="form-control reporttextarea" id="" rows="3" name="ans[]">Normal nasal mucosa</textarea>
</div>
</div>
</div>
<div class="row mb-2">
<i class="fas fa-image fa-2x mx-2"></i> Upload Images <input type="file" class="mx-2" id="1_upload" accept="image/*" name="uploaded[]" multiple />
</div>
<div class="row mt-4">
<div class="col-md-24">
<div class="form-group">
<label for="exampleFormControlTextarea1">Turbinates</label>
<input type="hidden" id="custId" name="qn[]" value="2">
<textarea class="form-control reporttextarea" id="" rows="3" name="ans[]">Bilateral turbinates normal</textarea>
</div>
</div>
</div>
<div class="row mb-2">
<i class="fas fa-image fa-2x mx-2"></i> Upload Images <input type="file" class="mx-2" id="2_upload" accept="image/*" name="uploaded[]" multiple />
</div>
<div class="row mt-4">
<div class="col-md-24">
<div class="form-group">
<label for="exampleFormControlTextarea1">Middle meatus</label>
<input type="hidden" id="custId" name="qn[]" value="3">
<textarea class="form-control reporttextarea" id="" rows="3" name="ans[]">Bilateral middle meatus normal</textarea>
</div>
</div>
</div>
<div class="row mb-2">
<i class="fas fa-image fa-2x mx-2"></i> Upload Images <input type="file" class="mx-2" id="3_upload" accept="image/*" name="uploaded[]" multiple />
</div>
<div class="row mt-4">
<div class="col-md-24">
<div class="form-group">
<label for="exampleFormControlTextarea1">Inferior Meatus</label>
<input type="hidden" id="custId" name="qn[]" value="4">
<textarea class="form-control reporttextarea" id="" rows="3" name="ans[]">Inferior Meatus normal</textarea>
</div>
</div>
</div>
<div class="row mb-2">
<i class="fas fa-image fa-2x mx-2"></i> Upload Images <input type="file" class="mx-2" id="4_upload" accept="image/*" name="uploaded[]" multiple />
</div>
<div class="row ">
<div class="col-sm-12">
</div>
<div class="col-sm-2">
<button type="submit" class="btn btn-primary btn-block">Save changes</button>
</div>
<div class="col-sm-12">
</div>
</div>
Когда я загружаю файлы для Turbinates и Inferior Meatus, но не для других, вывод в командной строке:
<QueryDict: {'csrfmiddlewaretoken': ['0dEBGstsSSzhOgebI2FBaHWioH7bEBmx0EPnYDE4nTrrNHZYMZCSTyId0FXAJYYR'], 'qn[]': ['1', '2', '3', '4'], 'ans[]': ['Normal nasal mucosa', 'Bilateral turbinates normal', 'Bilateral middle meatus normal', 'Inferior Meatus normal'], 'uploaded[]': ['', '']}>
1 Normal nasal mucosa
2 Bilateral turbinates normal
3 Bilateral middle meatus normal
4 Inferior Meatus normal
<MultiValueDict: {'uploaded[]': [<InMemoryUploadedFile: Screenshot from 2019-01-27 11-32-34.png (image/png)>, <InMemoryUploadedFile: Screenshot from 2019-01-26 16-25-56.png (image/png)>, <InMemoryUploadedFile: Screenshot from 2019-01-26 16-25-18.png (image/png)>, <InMemoryUploadedFile: Screenshot from 2019-01-27 11-32-34.png (image/png)>]}>
Screenshot from 2019-01-27 11-32-34.png
Saved picture to disk: Screenshot from 2019-01-27 11-32-34.png
Screenshot from 2019-01-26 16-25-56.png
Saved picture to disk: Screenshot from 2019-01-26 16-25-56.png
Screenshot from 2019-01-26 16-25-18.png
Saved picture to disk: Screenshot from 2019-01-26 16-25-18.png
Screenshot from 2019-01-27 11-32-34.png
Saved picture to disk: Screenshot from 2019-01-27 11-32-34.png
Все файлы попадают в коллекцию Querydict.Я не могу определить, к какому разделу он принадлежит.Можно ли как-нибудь пометить определенные теги файлов, чтобы при отправке формы я мог выполнять итерацию списка и сохранять каждый файл, помечая их в отдельном заголовке раздела.Часть базы данных проста.Я хочу знать, как создать файл тегов / HTML.