I am submitting 2 forms with one button using JavaScript. But when I am trying to access it using request.form in flask, it is only showing the 2nd form(the last submitted form). How can I access both forms in the backend? Will I have to use ajax? I am new to JS, flask, HTML. Thanks!
Here's my HTML code:
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<form method ="post" id="f1" name = "form1" action="{{url_for('process')}}">
<input type="text" name = "name">
</form>
<form method ="post" id="f2" name="form2" action="{{url_for('process')}}">
<input type="text" name = "name">
</form>
<button type="button" value="submit" onclick="sub()">sub
</button>
</body>
<script>
function sub(){
document.getElementById("f1").submit();
document.getElementById("f2").submit();
}
</script>
</html>
Here's my flask code:
from flask import Flask, request, render_template
app = Flask(__name__)
#app.route('/')
def home():
return render_template('forms.html')
#app.route('/processing', methods=['POST',"GET"])
def process():
print(request.form) #This only prints ImmutableMultiDict([('name', 'name submitted by f2')])
return "processsed"
if '__main__' == __name__:
app.run(debug=True)
Use form data and send.
Not tested, if there's any problem please comment.
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<form method ="post" id="f1" name = "form1" action="{{url_for('process')}}">
<input type="text" name = "name">
</form>
<form method ="post" id="f2" name="form2" action="{{url_for('process')}}">
<input type="text" name = "name">
</form>
<button type="button" value="submit" onclick="sub()">sub
</button>
</body>
<script>
async function sub() {
var form = new XMLHttpRequest();
form.open(document.getElementById("f1").method, document.getElementById("f1").action);
var p = new Promise(r => {
form.onreadystatechange = function() {
if (form.readyState === XMLHttpRequest.DONE && form.status === 200) r();
}
});
form.send(new FormData(document.getElementById("f1")));
await p;
form = new XMLHttpRequest();
form.open(document.getElementById("f2").method, document.getElementById("f2").action);
p = new Promise(r => {
form.onreadystatechange = function() {
if (form.readyState === XMLHttpRequest.DONE && form.status === 200) r();
}
});
form.send(new FormData(document.getElementById("f2")));
await p;
window.location.reload();
}
</script>
</html>
Related
I made a username and password validation but although I filled in valid information, it outputs invalid. The input is from <input> tag, with IDs, where the information entered is stored into arrays. Is it data type or syntax issues?
HTML Code 1:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<span>Username</span>
<input id="user" placeholder="enter username">
<br>
<br>
<span>Password</span>
<input id="pass" placeholder="enter password">
<br>
<br>
<button onclick="save()">Enter</button>
<script src="pass.js"></script>
</body>
</html>
HTML Code 2:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<span>Username</span>
<input id="user" placeholder="enter username">
<br>
<br>
<span>Password</span>
<input id="pass" placeholder="enter password">
<br>
<br>
<button onclick="valid()">Validate</button>
<br>
<br>
<h1 id="ans"></h1>
<script src="pass.js"></script>
</body>
</html>
Javascript Code (in a separate file):
var user = [];
var pass = [];
function save( ) {
var x = document.getElementById("user").value;
var y = document.getElementById("pass").value;
user.push(x);
pass.push(y);
console.log(user);
}
function valid() {
var a = document.getElementById("user").value;
var b = document.getElementById("pass").value;
var validationa;
var validationb;
for (let x in user) {
if (x == a) {
validationa = 1;
} else {
validationa = 0;
}
}
for (let y in pass) {
if (y == b) {
validationb = 1;
} else {
validationb = 0;
}
}
if (validationa == 1 && validationb == 1) {
document.getElementById('ans').innerHTML = "valid";
} else {
document.getElementById('ans').innerHTML = "invalid";
}
}
It gives a valid output if the username and password entered is consistent. Both HTML files use the same Javascript source file.
So I've been trying to get user input to calculate outer product of two vectors using tensorflow.js but I couldn't figure out how to get an array from html to pass it into javascript. for example inside the calculator function const a has to be something like this tf.tensor1d([1, 2, 3])
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Document</title>
<script src="https://cdn.jsdelivr.net/npm/#tensorflow/tfjs#2.0.0/dist/tf.min.js"></script>
</head>
<body>
<h1 class="text1">Welcome to vector cross product calculator!</h1>
<h2>Please enter two vectors like 1,2,3 and 3,2,1</h2>
<label>vector a</label>
<input type="text" name="vectora" id="vectora" class="vectora" placeholder="enter a vector like 1,2,3"> <br>
+<br>
<label>vector b</label>
<input type="text" name="vectorb" id="vectorb" class="vectorb" placeholder="enter a vector like 1,2,3"><br>
<button type="button" class="btn btn-info" onclick="calculator()">submit</button><br><br>
<div class="screen" id="screen1"></div>
</button>
<script>
function calculator(){
var vectora = document.getElementById("vectora").value;
var vectorb = document.getElementById("vectorb").value;
const a = tf.tensor1d(vectora);
const b = tf.tensor1d(vectorb);
var c = tf.outerProduct(a, b);
document.getElementById("screen1").innerHTML=c;
}
</script>
</body>
</html>
A utility function getArray can help.
function getArray(data) {
return data.split(',').map(s => +s)
}
function calculator(){
var vectora = document.getElementById("vectora").value;
var vectorb = document.getElementById("vectorb").value;
const a = tf.tensor1d(getArray(vectora));
const b = tf.tensor1d(getArray(vectorb));
var c = tf.outerProduct(a, b);
document.getElementById("screen1").innerHTML=c;
}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Document</title>
<script src="https://cdn.jsdelivr.net/npm/#tensorflow/tfjs#2.0.0/dist/tf.min.js"></script>
</head>
<body>
<h1 class="text1">Welcome to vector cross product calculator!</h1>
<h2>Please enter two vectors like 1,2,3 and 3,2,1</h2>
<label>vector a</label>
<input type="text" name="vectora" id="vectora" class="vectora" placeholder="enter a vector like 1,2,3"> <br>
+<br>
<label>vector b</label>
<input type="text" name="vectorb" id="vectorb" class="vectorb" placeholder="enter a vector like 1,2,3"><br>
<button type="button" class="btn btn-info" onclick="calculator()">submit</button><br><br>
<div class="screen" id="screen1"></div>
</button>
<script>
function getArray(data) {
return data.split(',').map(s => +s)
}
function calculator(){
var vectora = document.getElementById("vectora").value;
var vectorb = document.getElementById("vectorb").value;
const a = tf.tensor1d(getArray(vectora));
const b = tf.tensor1d(getArray(vectorb));
var c = tf.outerProduct(a, b);
document.getElementById("screen1").innerHTML=c;
}
</script>
</body>
</html>
i've been having a problem where i have a form in which several entities within an unordered list are displayed, a name and a button dinamically with vanilla javascript. The problem is, im changing the action value from the html form, from javascript this so i can add an id that i get in a JSON from a http request so i can manipulate a specific object, but it doesnt send the "delete" request, which is actually a post request that im managing from my server side correctly (tested in postman and works like a charm), but when calling from the front-end it stops working. Here are my html and script.
PANEL.HTML
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<!-- <meta http-equiv="Content-Security-Policy" content="default-src https://cdn.example.net; child-src 'none'; object-src 'none'"> -->
<link rel="stylesheet" type="text/css" href="css/panel-style.css">
<script defer src="panel-script.js"></script>
<title>Panel de Control</title>
</head>
<body>
<header>
<img src="assets/mrvapeslogo.png" alt="mrvapes logo">
</header>
<section>
<form id="files-form" accept-charset="UTF-8" enctype="multipart/form-data" action="#" autocomplete="off" method="POST" onsubmit="return validate(this);">
<label for="user">Banners Activos</label><br/>
<ul id="files-container">
</ul>
</form>
<form accept-charset="UTF-8" enctype="multipart/form-data" action="http://localhost:3000/banner" autocomplete="off" method="POST" target="_blank">
<div class="container">
<div class="button-wrap">
<!-- <label class="button" for="upload">Subir</label> -->
<input type="text" id="name" placeholder="Nombre de Archivo" value="" name="name" required>
<input id="image" name="file" value="Subir" placeholder="Subir Archivo" type="file" required>
<button id="upload" value="post-request" type="submit">Enviar</button>
<!-- <input id="upload" type=" submit " value="Enviar " onclick="submit() "> -->
</div>
</div>
</form>
</section>
</body>
PANEL-SCRIPT.JS
const list = document.getElementById("files-container");
const filesForm = document.getElementById("files-form");
fetch('http://localhost:3000/banner')
.then(response => response.json())
.then(json => {
console.log(json)
console.log(json.message)
for (let i = 0; i < json.message.length; i++) {
var item = `<li>${json.message[i].name}
<button id="delete-button" onclick="deleteButton('${json.message[i].name}','${json.message[i]._id}')">Borrar</button>
</li>`;
list.innerHTML += item;
}
});
function deleteButton(name, id) {
var answer = confirm(`Seguro que deseas borrar ${name}?`);
if (answer) {
filesForm.action = `http://localhost:3000/banner/${id}`;
alert('Borrado Correctamente!');
window.location.reload(true);
} else {
validate();
}
}
function validate() {
return false
}
HAPPY HOLIDAYS! :D
-- UPDATE --
When making these changes below to my panel-script.js, my delete function starts working but everytime i cancel the confirm dialog it forwards me to a "cannot post page".
function deleteButton(name, id) {
var answer = confirm(`Seguro que deseas borrar ${name}?`);
if (answer) {
filesForm.action = `http://localhost:3000/banner/${id}`;
alert('Borrado Correctamente!');
// window.location.reload(true);
} else {
// validate();
return false;
}
}
// function validate() {
// return false
// }
I have a first page, which, onload, shows the default get params.
Page1.html
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<script defer src="assets/main.js"></script>
<title>Document</title>
</head>
<body">
<div>
<h1>Nous avons reçu : </h1>
<h2 style="display: inline-block">LOGIN : </h2>
<p style="display: inline-block" id="login"></p>
</div>
<div >
<h2 style="display: inline-block">PASSWORD : </h2>
<p style="display: inline-block" id="password"></p>
</div>
</body>
<script>
</script>
</html>
Page1_main.js
// Version 1
const url = new URL(window.location.href);
const params = url.searchParams;
params.set('LOGIN', 'Licois');
params.append('PASSWORD', 'Johanne')
url.search = params.toString();
window.history.replaceState({}, '', location.pathname + '?' + params);
if (params.has('LOGIN')) {
alert("Licois !");
} else {
alert("Licois est introuvable !")
}
if (params.has('PASSWORD')) {
alert("Johanne !");
} else {
alert("Johanne a disparu !")
}
document.getElementById("login").innerHTML = params.get("LOGIN");
document.getElementById("password").textContent = params.get("PASSWORD");
Result : page1 result
Ok, this is what I wanted.
But then, I have to have another page (with html only), which will send new get parametes to the first page, and shown them there in the HTML and URL. But in this case I cannot show "Joanne" and "Licois" anymore, or show the new params as "param3= " and "param4= ".
Page2_html
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Exercice 2</title>
</head>
<body>
<form action="Page1.html" method="GET">
<label for="login">Login</label>
<input type="text" name="login" id="login" >
<div><br></div>
<label for="password">Password</label>
<input type="text" type="password" for="password" name="password" id="password">
<div><br></div>
<button type="submit" id="envoyer">Envoyer</button>
</form>
</body>
</html>
Page2_form
I succeed at sending the new params to the first page ("action='Page1.html'").
But I can't manage to show them in the HTML and URL.
No, nevermind, I got it.
Changed Page2.html to
<body>
<form action="Page1.html" method="GET">
<label for="login">Login</label>
<input type="text" name="NEW_LOGIN" id="NEW_LOGIN" >
<div><br></div>
<label for="password">Password</label>
<input type="text" type="password" for="password" name="NEW_PASSWORD" id="NEW_PASSWORD">
<div><br></div>
<button type="submit" id="envoyer">Envoyer</button>
</form>
</body>
</html>
And added this to Page1_main.js
if (params.has('NEW_LOGIN')) {
document.getElementById("login").innerHTML = params.get("NEW_LOGIN");
} else if ((params.has('LOGIN'))) {
document.getElementById("login").innerHTML = params.get("LOGIN");
}
if (params.has('NEW_PASSWORD')) {
document.getElementById("password").innerHTML = params.get("NEW_PASSWORD");
} else if ((params.has('PASSWORD'))) {
document.getElementById("password").innerHTML = params.get("PASSWORD");
}
EZ
I'm making a code where the user enters information and it stores it in an object, but when I check if the object is saved by alerting one of its values it says there is no such object.
here is my code.
let users = {};
function user(name,real){
this.username = name,
this.realname = real,
this.id = Math.floor(Math.random() *1000);
this.subs = 0,
this.videos = [],
this.listuser = function() {
return this.username;
}
};
function newuser(name, email,username){
users[name] = new user(username, name);
};
let savefile = () => {
var channame = string(document.getElementById('channame'));
var name = string(document.getElementById('name'));
var email = string(document.getElementById('email'));
newuser(name,email,channame);
}
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width">
<title>youtube ripoff</title>
<link href="style.css" rel="stylesheet" type="text/css" />
</head>
<body>
<br> <br><br><br><br><br>
<form action="">
<label for="username">Channel Name: </label>
<input type="text" id="channame" name="channelname"><br>
Real Name
<input type="text" id="name" name="name"><br>
Email
<input type="text" id="email" name="email"><br>
<input type="submit" value="Submit" onmousedown="newuser('name1','name#gmail.com','channelname1');">
<br><br><br><br>
<input type="button" value="Load Channels" id="seech" name="seechannels" onmousedown="alert(users['name1'].listuser());"><br>
</form>
<script src="script.js">
function fun(){
window.alert("starting program...")
//other code
}
</script>
</body>
</html>
Is there some sort of error that I'm not seeing?
After click on submit button in form with action="" page is reload and all data is lost. Pleas use:
<form action="javascript:void(0)">
instead of
<form action="">
This prevent page reload.