Как я могу узнать, из какого тега ввода был загружен конкретный файл в запросе. ФАЙЛЫ? - PullRequest
0 голосов
/ 30 января 2019

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

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

1 Ответ

0 голосов
/ 30 января 2019

Во-первых, не называйте поля с [].Это PHP / Rubyism, в Django это не нужно.

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

...