Форма django для загрузки файла возвращает ошибку, так как форма недействительна - PullRequest
0 голосов
/ 18 октября 2019

Я занимаюсь разработкой приложения в Django. Моим пользователям разрешено сохранять данные путем составления формы, подобной этой

Инструмент:

акроним:

определение:

определенос помощью следующей функции в forms.py:

class tool_form(forms.ModelForm):

    class Meta:
        model=tool
        fields=["Tool", "Acronym", "Definition"]

, которая сохраняет данные в модель, подобную этой:

class tool(models.Model):

    Tool = models.CharField(max_length=256, blank=True, null=True)
    Acronym = models.CharField(max_length=25, blank=True, null=True)
    Definition = models.TextField(blank=True, null=True)

Функция просмотра, позволяющая это, имеет вид:

def add_tool(request):

    if request.method=='POST':
        form = tool_form(request.POST or None) 

        if form.is_valid():
            form.save()

            messages.success(request, ("Submit succeed!"))
            return redirect('adding_tools')

        else:

            messages.error(request, ('ERROR: submit failed'))
            return render(request, 'adding_tools.html', {})

    else:   
        return render(request, 'adding_tools.html', {}) 

Теперь я хочу, чтобы мои пользователи могли многократно копировать одну и ту же форму одновременно. Чтобы достичь этого, я разрешаю моим пользователям загружать файл, скопированный с данными для вставки. Поэтому я разрешаю пользователям загружать файл шаблона xlsx со столбцами с указанным именем

Имя столбца 1 (ячейка A1): Инструмент

Имя столбца 2 (ячейка B1): сокращение

Имя столбца 3 (ячейка C1): определение

Чтобы скомпилировать его, вставьте множество записей, а затем загрузите его обратно. Поэтому я хочу, чтобы мой код сохранил эти данные в той же модели, которая была объявлена ​​ранее (инструмент). Я пытаюсь добиться этого с помощью:

в шаблоне add_tool_sheet.html:

   <form class="container" method="POST" enctype="multipart/form-data" >
        {% csrf_token %}

        <div class="file-upload-wrapper" id="input-file-now">

            <small id="inputHelp" class="form-text text-muted">Select file to upload.</small>                  
            <input type="file"  name="uploaded_file" id="input-file-now" data-max-file-size="5M" class="file-upload">

            <br><br>

            <div class="form-group">                
                 <input name="Date" type="hidden" class="form-control" id="date_to_turn_into_toda">              
            </div>

            <button type="submit" class="btn btn-primary">Upload</button>
        </div>

    </form>

в формах. py:

class tool_file_form(forms.ModelForm):

    class Meta:
        model=tool_file
        fields=["Tool_file", "Date"]

В models.py

class tool_file(models.Model):

    Tool_file = models.FileField(upload_to='uploaded_sheets/', blank=False, null=False)
    Date = models.DateField(blank=False, null=False, default=timezone.now().date() )

    class Meta:
        ordering = ['Date', 'Tool_file']

    def clean(self):
        if not (self.Tool_file or self.Date):
            raise ValidationError("something went wrong")


    def __str__(self):    

        return  "%s ----- [%s]"  %  (self.Tool_file, self.Date) 

в views.py:

def add_tool_sheet(request):


    if request.method=='POST': 

        form = tool_file_form(request.POST, request.FILES)

        if form.is_valid():
            form.save()            

            messages.success(request, ("upload succeeded"))
            return redirect('add_tool_sheet')

        else:

            messages.error(request, ('ERROR n1'))
            return render(request, 'add_tool_sheet.html', {})


    else:   
        return render(request, 'add_tool_sheet.html', {}) 

Когда я пытаюсь добавить новые объекты в файл модели из файла инструментов изАдминистративный раздел, он работает.

Но когда я пытаюсь добавить новые объекты из пользовательского интерфейса (шаблон add_tool_sheet.html), он возвращает

ОШИБКА n1

как сообщение, и моя консоль возвращает

GET / admin / HTTP / 1.1 "200 7381

Почему?

Обратите внимание:

Загрузка из раздела администратора работает, загрузка из интерфейса пользователя - нет.

1 Ответ

0 голосов
/ 21 октября 2019

РЕШЕНО

В шаблоне я поместил

name="uploaded_file"

, но для того, чтобы соответствовать информации в формах forms.py и model.py, оно должно быть:

name="Tool_file"

Теперь это работает!

...