我已经尝试解决这个问题有一段时间了,但我很困惑,这个问题有点独特,因为我正在检查标头的 csv 文件来自 forms.py 中的文件上传。我的意思是,正在检查的 csv 文件不存在于任何目录中,因此您不能只打开特定文件,仅从我对其他解决方案的研究来看,它们似乎都是关于目录中的现有文件而不是文件上传。
因此,标题必须=“IP地址”,并且当文件标题等于“”或!=“IP地址”时,表单将毫无问题地提交,当表单提交时,Django调试窗口会出现。我正在努力输入验证错误或实施重定向。
如果您有任何有用的链接、文档或想要解决问题,请随意,我将非常感激。
import csv
import io
import pandas as pd
from typing import Any
from django import forms
from django.core.exceptions import ValidationError
from django.core.validators import FileExtensionValidator
from api.utils.network_utils import NetworkUtil
from .models import BlockedList
表格.py
class CSVForm(forms.Form):
csv_file = forms.FileField(required=True, validators=[FileExtensionValidator(allowed_extensions=[".csv", ".xls", "xlsx"])])
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.ips_from_csv = []
def get_ips_from_csv(self):
return self.ips_from_csv
def clean_csv_file(self):
csv_file = self.cleaned_data.get("csv_file")
if not csv_file:
return
with csv_file.open() as file:
reader = csv.DictReader(io.StringIO(file.read().decode("utf-8")))
for row in reader:
form_data = self.cleaned_data.copy()
form_data["address"] = NetworkUtil.extract_ip_address(row["IP Address"])
self.ips_from_csv.append(form_data["address"])
我确实知道文件扩展名验证仍然很弱,因为它不检查文件内容,我正在自己做这件事。但我遇到困难的是 clean_csv_file(self),该文件字段在我的 models.py 中不存在,因为我没有将这些文件/上传存储在任何媒体目录中。
在你的方法的末尾
CSVForm.clean_csv_file()
有这一行:
form_data["address"] = NetworkUtil.extract_ip_address(row["IP Address"])
变量
row
的类型为dict
,其中键是列标题(意味着键是CSV文件中的列的名称,通常由文件的第一行定义)。
如果您通过键
row
访问变量 IP Address
,则仅当 CSV 文件中的第一行包含单词 IP Address
时才有效;否则你的代码行可能会引发 KeyError: IP Address is not a valid key
。
要解决此问题,您可以添加代码以确保在迭代文件的行之前文件的第一行包含正确的名称。
或者您可以在代码中添加错误处理逻辑(例如
try-except
)。