Django:不能将参数传递给Python类,名称' uid'没有定义

时间:2014-04-03 07:29:01

标签: python django file constructor upload

我已经在很长一段时间内一直在努力解决这个简单的问题。

我没有使用Python编程的经验,所以我为此道歉。我尽力尝试每一个解决方案,并查看这个网站寻求帮助..但收效甚微。

我正在尝试编写一个简单的类来帮助我上传用户提交的文件对。我希望它能做到这样的事情:

  • 上传文件 .txt和 somethingelse .txt
  • 处理文件
  • 将文件重命名为 uniqueID -1 .txt和 uniqueID -2 .txt的
  • 将文件保存在远程服务器上

所以这就是我目前为一个文件做的事情(因为我正在做一对,这个过程可以再次重复)

我目前从POST请求中获取信息,以便在我的views.py中执行以下操作(其中newID是uniqueID,num是文件名的后缀):

newID = uuid4().hex
num = 1
upload = UploadFile()
upload.file = request.FILES['inputfile1'])
upload.save()

UploadFile类在我的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 = ...”一样,但这也不起作用。我已经尝试将“文件”字段移动到函数和构造函数中。

我无法找到一个平衡点,我可以在课堂上保留“文件”,并且仍然可以访问“自我”或任何字段。

如何将这些整数传递给我的UploadFile类?

非常感谢你的时间和帮助。我希望我能够充分解释我的困境,我希望尽快解决这个问题!

1 个答案:

答案 0 :(得分:0)

你应该使用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/#filefield https://docs.djangoproject.com/en/1.6/topics/forms/ https://docs.djangoproject.com/en/1.6/topics/forms/modelforms/