【发布时间】:2023-03-13 23:42:01
【问题描述】:
我正在用 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):定义
编译它,插入许多记录,然后上传回来。 所以我希望我的代码将这些数据保存到之前声明的相同模型中(工具) 我试图通过以下方式实现这一目标:
在模板中添加_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>
在forms.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
为什么?
请注意:
从管理部分上传有效,从用户界面上传无效。
【问题讨论】:
-
我不确定您的模板有什么问题,但是如果您希望您的用户从 excel 文件中批量导入数据,您是否应该考虑使用诸如 django-import-export.readthedocs.io/en/latest 之类的导入工具?这将允许您的用户直接在工具模型中添加新条目,并且不再需要在单独的模型中上传文件本身。
-
我已经为管理部分实现了它,我认为该工具只是从管理部分导入数据。我没有发现从模板中使用它的迹象...您能否给我指出一个使用 import-export 的示例?
-
你检查过链接了吗?有一个比较全面的例子django-import-export.readthedocs.io/en/latest/…
标签: forms validation django-models django-forms django-views