如何在另一个页面中创建表单处理数据和输出?

时间:2014-07-22 02:33:29

标签: python html django forms

我正在尝试创建一个分子量计算器网页,用户输入化学公式并获得质量。我使用raw_input()在python中完成了这项工作,但现在我需要使用带有django的表单。

我设置了html表单,但是当我点击“提交”时,页面再次显示自己。 我想要发生的是:

  1. 用户在index.html(例如H2)上输入公式
  2. 使用我在结果视图中输入的代码
  3. 处理表单数据
  4. 结果在result.html中输出
  5. 但是,我不知道如何做到这一点,因为我已经查看了教程和表单文档。

    这是我的views.py:

    from django.shortcuts import render from django.db import connection from django.http
    import HttpResponseRedirect from django.core.urlresolvers
    import reverse import sys, re
    
    def index(request):
        if request.method == "POST":
            return HttpResponseRedirect(reverse('MolecularMass:result'))
    else:
        return render(request, 'MolecularMass/index.html')
    def result(request):
        c = connections['default'].cursor()
    
    def FindEndParentheses(separated):
        count = 0
        for index, val in enumerate(separated):
            if val == ')':
                count -= 1
                if count == 0:
                    return index
            elif val == '(':
                count += 1
        raise NameError('Please close the parentheses')
    def GetAtomicMass(val):
        c.execute("SELECT Atomic_Weight FROM Elements WHERE Atomic_Numer=%s" % val)
        return c.fetchone[0]
    def Parser(separated, total):
        if len(separated) == 0:
            return sum(total)
        val = separated[0]
        if val == '(':
            end = FindEndParentheses(separated)
            total.append(Parser(separated[1:end], []))
            return Parser(separated[end + 1:], total)
        elif val.isdigit():
            total[-1] *= int(val)
        else:
            total.append(GetAtomicMass(val))
        return Parser(separated[1:], total)
    def CalcMolecularMass(formula):
        separated = re.findall(r'[A-Z][a-z]*|\d+|\(|\)', formula)
        return('The molecular mass of {} is {:.3f}\n'.format(formula, Parser(separated, [])))
    return render(request, 'MolecularMass/result.html', CalcMolecularMass(formula))
    

    我的index.html:

    <h1>Enter a chemical formula to get its molecular mass</h1>
    <form action="{% url 'MolecularMass:result' %}" method="POST">
    {% csrf_token %}
        <input type="text" name="formula"/>
        <input type="submit" value="Submit"/>
    </form>
    

    我的result.html:

    {{ content }}
    

1 个答案:

答案 0 :(得分:0)

有几种方法可以做到这一点。我能想到的最简单的方法是在index.html模板上为你的提交按钮定义一个onclick事件监听器,它调用一些负责触发视图的javascript函数。在序列化后将表单数据作为参数发送。然后,您应该能够操作数据并使用return render(request, 'your_app/result_url', context) context参数是可选的。

Django文档要求您遵循的一些做法,例如将您的表单(您尝试输入数据的地方)放在forms.py文件中。这使得一切都更容易调试。

我强烈建议您正确阅读Django Forms

一旦你这样做,事情就会变得清晰。看看Dajax和Dajaxice。这些使应用程序内的异步调用非常容易。例如,dajax.assign()方法允许您从视图中操作HTML元素及其属性,并返回json对象,这将使您的用例中的内容变得非常简单。