【发布时间】:2021-08-01 05:55:12
【问题描述】:
我正在使用 Flask (https://astrodados.herokuapp.com/juego) 开发一个骰子应用程序,并且我想在不刷新页面的情况下使用相同的表单数据(如骰子数量)重新掷骰子。为此,我使用 Jquery 和 Ajax。我不明白为什么,但我无法获取数据,所以我收到错误“TypeError: int() argument must be a string, a bytes-like object or a number, not 'NoneType'”。 当我在 juego.html 中提交表单时,它会将我发送到 resjuego.html 并且一切正常。但是当我单击 resjuego.html 中的重新滚动按钮 ('#re_tirada') 时,Jinja 向我显示了错误。我看不出我做错了什么。我看过教程并尝试了很多不同的编码方式,但我无法获取数据。
我在 juego.html 中使用 Ajax 发送表单数据:
<script>
$(document).ready(function() {
$('form').on('submit', function(event) {
$.ajax({
data : {
signo : $('#signoInput').val(),
pool : $('#poolInput').val(),
magnitud : $('#magnitudInput').val()
},
type : 'POST',
url : '/back_retirada'
})
event.preventDefault();
});
});
</script>
...
<form action=" {{(url_for('resjuego'))}}", method="post">
<div class='text-center'>
<div class="form.row">
<div class="col">
<p class = "instrucciones">Ingresa tu ascendente: </p>
<div id='signo'>
{{ form.signo (class_="form-control form-control-lg")}}
</div>
<p class = "instrucciones">Elige la cantidad de dados:</p>
<div id='pool'>
{{form.pool (class_="form-control form-control-lg")}}
</div>
<p class = "instrucciones">
Elige la magnitud de tu acción: </p>
<div id='magnitud'>
{{form.magnitud (class_="form-control form-control-lg")}}
</p>
</div>
</div>
<button type="submit">¡Tira los dados!</button>
</div>
</div>
</form>
这是我在 routes.py 中接收数据的视图:
@app.route('/back_retirada', methods=['GET', 'POST'])
def back_retirada():
signo = request.form['signo']
pool = request.form['pool']
magnitud = request.form['magnitud']
return jsonify ({'signo' : signo, 'pool': pool, 'magnitud': magnitud})
这是 /resjuego 的视图:
@app.route('/resjuego', methods=['GET','POST'])
def resjuego():
form = CumuloForm()
signo=request.form.get('signo')
pool=request.form.get('pool', type = int)
magnitud=request.form.get('magnitud', type = int)
x = pool
m = magnitud
i=0
roll=Dado.signar(x)
res=roll
y=rnd.randint(1,6)
entropia=Dado.signar(y)
thislist=[]
thislist2=[]
for i in range(x):
thislist.append(Aspecto.aspectario(signo, res[0+i]))
zumbi = thislist
for i in range(y):
thislist2.append(Aspecto.aspectario(signo, entropia[0+i]))
zumbi2 = thislist2
totalasp=zumbi+zumbi2
conj = 2*(zumbi.count("conjunción"))
semsex = 0*(zumbi.count("semisextil"))
sext = 1*(zumbi.count("sextil"))
cuad = -1*(zumbi.count("cuadratura"))
trig = 1*(zumbi.count("trígono"))
quinc = 0*(zumbi.count("quincuncio"))
opos = -2*(zumbi.count("oposición"))
conj2 = 2*(zumbi2.count("conjunción"))
semsex2 = 0*(zumbi2.count("semisextil"))
sext2 = 1*(zumbi2.count("sextil"))
cuad2 = -1*(zumbi2.count("cuadratura"))
trig2 = 1*(zumbi2.count("trígono"))
quinc2 = 0*(zumbi2.count("quincuncio"))
opos2 = -2*(zumbi2.count("oposición"))
éxitos = conj + semsex + sext + cuad + trig + quinc + opos
éxitosent= conj2 + semsex2 + sext2 + cuad2 + trig2 + quinc2 + opos2
if éxitos + m <=0:
rest="fallo"
if éxitos >=0:
rest="éxito"
if éxitos <=0 and éxitos + m >=0:
rest="adverso"
des_exitos = descriptorc(rest)
T1 = struli(zumbi)
T2 = struli(zumbi2)
res=struli(res)
entropia=struli(entropia)
return render_template('resjuego.html', title='Caosmos', lanzarcum=res, signo = signo, entropia=entropia, aspecto=T1, aspecto2=T2, éxitos=éxitos, éxitosent = éxitosent, des_exitos=des_exitos)
这是获取此数据的 jquery 代码,在 resjuego.html 中:
<script type=text/javascript>
$(function() {
$("#re_tirada").click(function() {$.getJSON(
'/back_retirada')
}) })
</script>
...
<div class='text-center'>
<form>
<span href=# id=re_tirada><button>¡Lanza otra vez!</button> </span>
</form>
</div>
【问题讨论】:
-
该错误是由于您使用函数
int()但传递了一个值为None的事实引起的。不幸的是,您发布的部分代码并非如此。会不会是你求一个表单值,想把它转成整数? -
是的,这就是我想做的。我从表单(字符串中的数字)中获取“池”值,然后将其转换为整数。当我第一次提交数据时它可以工作,但当我尝试重新滚动时它不起作用。
-
解释如下。 AJAX 是一种在后台传输数据而无需重新加载和渲染整个页面的方式。您还可以使用标准表格来实现您的目标。当您发送 GET 请求时,服务器端的表单对象为空,例如使用 getJSON。因此,如果端点允许这两种方法,您应该使用请求对象或 wtforms 来区分 GET 和 POST 请求。 Wtforms 为您提供验证条目的额外优势。
-
我理解你的意图,但你的尝试是压倒性的。您的代码中使用了许多不同的技术。您应该将自己减少到最低限度,以便逐步实现目标。我删除了我的答案,因为它不再有用。请不要放弃,你会实现你的目标。很抱歉没能帮到你。
标签: javascript jquery user-interface flask frontend