Я занимаюсь разработкой приложения в 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
Почему?
Обратите внимание:
Загрузка из раздела администратора работает, загрузка из интерфейса пользователя - нет.