Django:如何在视图下从一个函数获取输入到另一个函数?

时间:2015-04-20 20:43:35

标签: django django-forms django-views

我是django的新手,我知道我的问题非常基本。我想设计一个具有两个功能的Web应用程序。第一个功能可以让用户在主页上输入wav音频文件名。第二个功能可以读取此音频文件并分析音频信号并制作fft图。如果我单独运行,我的每个函数都可以正常工作,我只是不知道如何让第二个函数读取第一个函数的文件名。

这是我输入文件名的第一个函数。

def home(request):
  form = EmailForm(request.POST or None)
  if form.is_valid():
        print form.cleaned_data['filename']
  context = {"form": form}
  template = "home.html"
  return render(request, template, context)

这是我的第二个功能的一部分:

def fftsound(request):
  from scipy import fft, arange, ifft
  from scipy.io import wavfile
  form = EmailForm(request.POST or None)
  if request.method == 'POST':    
      print "POST"
      if form.is_valid():
            print "valid"
            filename = form.cleaned_data.get('filename')
  else:
     form = EmailForm()
  rate,data=wavfile.read(filename)

我的表单如下:

class EmailForm(forms.Form):
  filename = forms.CharField(max_length=100, required=True)

我的模型看起来像这样:

class application(models.Model):
  filename= models.CharField(max_length=100, blank=False, null=False)
  def __unicode__(self):
    return "%s" %(self.filename)

现在如果我只运行我的第一个功能,我可以在终端上获得正确的打印。我只是不知道如何在我的第二个函数上应用这个输入。谁能帮我这个?非常感谢你!

2 个答案:

答案 0 :(得分:0)

在你的第一个函数中

return fftsound(request, filename)

在你的第二个功能中,

def fftsound(request, filename):

将最后一行更改为

return render(request, template, context)

答案 1 :(得分:0)

我建议您在家庭视图中使用类似的内容:

def home(request):
    if request.method == 'POST':
        form = EmailForm(request.POST)

            if form.is_valid():
                app = application.objects.create(filename=form.cleaned_data['filename'])

        return HttpResponseRedirect('/fft/{}/'.format(app.id))

    form = EmailForm()
    return render(request, 'home.html', {'form': form})

这会将文件名保存到数据库,因此您可以稍后阅读,并将用户重定向到下一个网址(这对每个文件都是唯一的 - /fft/<file_id>)。

您还必须将实际文件保存到数据库中吗?或者更好:将其保存到磁盘并在数据库中引用它。阅读THIS了解mor信息。

下一步是在urls.py文件中添加条目以处理这个新网址。它看起来像:

url(r'^fft/(?P<file_id>[0-9]+)/$', views.fftsound),

使用此功能,您将为file_id功能提供额外参数(fftsound)。所以你必须稍微修改一下。

def fftsound(request, file_id):
    app = application.objects.get(id=file_id)
    ...

你将在app.filename中有文件名,并在app.fftfile中提交文件(或者类似的东西 - 正如我所提到的,你必须添加这部分)。无论你想要什么,你都可以随心所欲。

使用此方法,您可以随时返回并查看已上传文件的fft图(只需转到让我们说/fft/42/)。因此,如果不希望所有文件都是公共文件,则必须添加某种访问控制。