很长一段时间以来,我一直在为看似简单的问题而苦苦挣扎。
我几乎没有用Python编程的经验,所以我为此道歉。我已经尽力尝试了所有解决方案,并检查此站点以获取帮助。无济于事。
我正在尝试编写一个简单的类来帮助我上传用户提交的文件对。我希望它做这样的事情:
- 上传文件.txt和其他东西.txt
- 进程文件
- 将文件重命名为唯一 ID-1.txt 和唯一 ID-2.txt
- 将文件保存在远程服务器上
所以这是我目前对一个文件的做法(因为我正在做一对,这个过程可以重复第二次)
我目前从 POST 请求中获取信息以在我的 views.py 中执行以下操作(其中 newID 是唯一 ID,num 是文件名的后缀):
newID = uuid4().hex
num = 1
upload = UploadFile()
upload.file = request.FILES['inputfile1'])
upload.save()
上传文件类在我的 models.py 中是这样的:
class UploadFile(models.Model):
file = models.FileField(upload_to=path_and_rename('path/', str(uid) + "_" + str(num)))
(其中path_and_rename是分别设置文件路径和名称的函数)
你可能注意到,我从不把newID和num传递给我的UploadFile类。这就是我遇到麻烦的地方。我对Python/Django不是很熟悉,我花了一段时间试图复习。我仍然无法完全弄清楚。我知道这是一个非常简单的问题!
如前所述,我在执行时收到错误:未定义名称"uid"
我尝试创建一个构造函数来使用 __init__ 初始化 newID 和 num,但我仍然遇到类似的问题。我也尝试像设置"upload.file = ..."一样设置该字段,但这也没有用。我也尝试将"file"字段移动到函数和构造函数中。
我真的找不到一个平衡点,我能够将"文件"保留在类的主体中,并且仍然可以访问"self"或任何字段。
如何将这些整数传递到我的 UploadFile 类中?
非常感谢您的时间和帮助。我希望我充分解释了我的困境,我希望尽快弄清楚这一点!
你应该使用 Django 表单。
# forms.py
from django import forms
from .models import UploadFile
class UploadFileForm(forms.ModelForm):
class Meta:
model = UploadFile
# models.py
from django.db import models
def path_to_rename(instance, fiename):
'''Compute path to filename'''
# define uid here
uid = getattr(instance, '_uid', None)
num = getattr(instance, '_num', None)
return os.path.join(uid, filename)
class UploadFile(models.Model):
# FileField accepts a callback that will be called when the instance is saved to get the new path
file = models.FileField(upload_to=path_to_rename)
def __init__(self, *args, **kwargs):
self._uid = None
sef._num = None
super(UploadFile, self).__init__(*args, **kwargs)
def save(self, uid=None, num=None, *args, **kwars):
self._uid = uid
self._num = num
super(UploadFile, self).save(*args, **kwargs)
# views.py
from django.shortcuts import render
from .forms import UploadFileForm
def my_view(request):
newID = uuid4().hex
num = 1
if request.method == 'POST':
form = UploadFileForm(request.POST, request.FILES)
if form.is_valid():
upload_file = form.save(commit=False)
upload_file.save(newID, num)
return redirect('where needed')
else:
form = UploadFileForm()
return render(request, 'template.html', {'form': form})
# template.html
<form action="" method="post" enctype="multipart/form-data">
{% csrf_token %}
{{ form.as_p }}
<form>
阅读:https://docs.djangoproject.com/en/1.6/ref/models/fields/#filefieldhttps://docs.djangoproject.com/en/1.6/topics/forms/https://docs.djangoproject.com/en/1.6/topics/forms/modelforms/