Описание проблемы:
У меня есть представление и шаблон django, который отображает несколько абзацев данных, полученных из модели. Под каждым из них находится тег <input type = "file"> для загрузки изображений, связанных с каждой строкой данных. Когда пользователь загружает файлы, он может загружать от 1 до нескольких файлов для одной конкретной строки модели или может не загружать файлы для одной или нескольких моделей. Мне нужно сохранить эти файлы с внешним ключом в этой конкретной строке. Я не использую для этого формы django.
Чтобы еще раз объяснить, в моем html есть несколько файловых тегов, каждый из которых находится под определенным набором текста из разных строк модели. При POST все файлы собираются в список в request.FILES, без понятия, из какого входного тега каждый из них был загружен. Мне нужно различать файлы, загруженные из разных файловых тегов, так как их нужно сохранять в модели, ссылаясь на разные строки по внешнему ключу. Как я могу узнать, из какого входного тега был загружен конкретный файл в 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. Я не могу определить, к какому разделу он относится. Есть ли способ пометить определенные теги файлов, чтобы при отправке формы я мог повторять список и сохранять каждый файл, помечая их в отдельном заголовке раздела. Часть базы данных проста. Я хочу знать, как создать файл tags/html.






Во-первых, не называйте поля с помощью []. Это PHP/Rubyism, в Django в этом нет необходимости.
Но способ иметь разные имена — это дать входным данным эти имена. Атрибут имени ввода — это то, что используется в качестве ключа в словарях FILES/POST.
Можно ли использовать уникальные имена вместо
uploaded[]для всех?