【问题标题】:django form to upload file returns error as form not validdjango 表单上传文件返回错误,因为表单无效
【发布时间】: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


【解决方案1】:

已解决

在模板中我放了

name="uploaded_file"

但为了匹配forms.py和model.py中的信息,它必须是:

name="Tool_file"

现在可以了!

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-07-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-10
  • 2012-10-16
  • 2013-03-21
相关资源
最近更新 更多