Как я могу узнать, из какого входного тега был загружен конкретный файл в request.FILES?

Описание проблемы:

У меня есть представление и шаблон 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.

Можно ли использовать уникальные имена вместо uploaded[] для всех?

SimonF 30.01.2019 12:55
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
1
32
1

Ответы 1

Во-первых, не называйте поля с помощью []. Это PHP/Rubyism, в Django в этом нет необходимости.

Но способ иметь разные имена — это дать входным данным эти имена. Атрибут имени ввода — это то, что используется в качестве ключа в словарях FILES/POST.

Другие вопросы по теме