Django:无法将参数传递给 Python 类,名称未定义 'uid'



很长一段时间以来,我一直在为看似简单的问题而苦苦挣扎。

我几乎没有用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/

相关内容

  • 没有找到相关文章

最新更新