Parse arrays sent with form - django

See this answer. In short, it transforms:
<input type="text" name="object[0][color]" value="red">
<input type="text" name="object[0][doors]" value="2">
<input type="text" name="object[0][color]" value="green">
<input type="text" name="object[0][doors]" value="4>
Into a PHP associative array:
'object' => array(
'0'=>array(
'color'=>'red',
'doors'=>'2'
),
'1'=>array(
'color'=>'green',
'doors'=>'4'
)
)
In Django, I try to do the same, but when I print request.POST, I get:
<QueryDict: {'object[0][color]': ['red'], 'object[0][doors]': ['2'], 'object[1][color]': ['green'], 'object[1][doors]': ['4']}>
How to convert it to a proper dict?

This should work:
myDict = dict(queryDict.iterlists())

Related

Smatry replace not print array of variable

{$variable.fieldname} = Username
My input <input type="text">
I have Tried {$variable|replace:"type=\"text\"":'type="text" placeholder="{$variable.fieldname}"'}
Getting Output: <input type="text" placeholder="{$variable.fieldname}">
Expected: <input type="text" placeholder="Username">
You need to assign an additional variable and use regex_replace method instead.
{assign var="newvar" value="type=\"text\" placeholder=\"{$variable.fieldname}\""}
{$variable|regex_replace:"/type=\"text\"/":{$newvar}}

Passing a variable from a form input to a flask URL

I have a dummy project in Flask, which consists in a web form, where you fill in 3 cities, which are then printed upon submition.
This is my init.py file:
#app.route('/average_temperatures/<city1>/<city2>/<city3>', methods=['POST', 'GET'])
def results_temperature(city1, city2, city3):
return "The cities are: {}, {}, {}".format(city1, city2, city3)
The function works, but I am unable to pass the variables from the form straight into the function, as parameters.
edit:
My goal is to have the city variables as part of the URL in the clean form of /city1/city2/city3.
This is the form:
<div class="input-group">
<form action="{{ url_for('results_temperature', city1=city1, city2=city2, city3=city3) }}" method="POST">
<input type="text" class="form-control" placeholder="City 1" name="city1"></input>
<input type="text" class="form-control" placeholder="City 2" name="city2"></input>
<input type="text" class="form-control" placeholder="City 3" name="city3"></input>
<div class="row" style="margin-bottom: 20px;"></div>
Filling out the form results in a URL
http://example.com/average_temperatures///
So I evidently fail to pass the form fields in the form action part.
Any hits are appreciated, cheers.
You should get the cities from the request.form variable.
#app.route('/average_temperatures', methods=['POST', 'GET'])
def results_temperature():
return "The cities are: {}, {}, {}".format(request.form['city1'], request.form['city2'], request.form['city3'])
In your HTML form:
<form action="{{ url_for('results_temperature') }}" method="POST">
<input type="text" class="form-control" placeholder="City 1" name="city1"></input>
<input type="text" class="form-control" placeholder="City 2" name="city2"></input>
<input type="text" class="form-control" placeholder="City 3" name="city3"></input>
</form>

Display empty default field in Django form

I would like to initialize my form with a default empty value.
In my views.py i have one like so:
form = BookingForm(initial={'name':''})
and in the template like so:
<tr><td><input class="input" type="text" name="name" id="id_name" placeholder="Enter your name" value={{ form.name }}/></td></tr>
The output however, in the html input field shows '/' instead of the placeholder.
Any ideas how to do this?
Try adding quotes around your {{ form.name }} like so:
<tr><td><input class="input" type="text" name="name" id="id_name" placeholder="Enter your name" value="{{ form.name }}"/></td></tr>
and if that doesn't change anything you can try in your forms.py:
name = forms.CharField(initial='')
rather than trying to set the default input value upon instantiation.

How can I access data sent in a post request in Django?

I have a form that is supposed to create a new 'Quote' record in Django. A 'Quote' requires a BookID for a foreign key.
This is my form
<form method="POST" action="{% url 'quotes:createQuote' %}">
{% csrf_token %}
<section>
<label for="q_text">Quote Text</label>
<input type="text" name="text" id="q_text" placeholder="Enter a Quote" style="padding-left:3px"> <br>
<label for="q_book">Book ID</label>
<input type="text" name="bookID" id="q_book" placeholder="Enter Book ID" style="padding-left:3px"> <br>
<label for="q_disp">Display Quote Now?</label>
<input type="radio" name="display" id="q_disp" value="True"> True
<input type="radio" name="display" value ="False">False <br>
<button value="submit">Submit</button>
</section>
</form>
And this is the method that it is targeting
def createQuote(request):
#b = get_object_or_404(Book, pk=request.bookID)
return HttpResponseRedirect(reverse('quotes:index'))
Somewhere in that request argument I assume there is some sort of field that contains the bookID the user will pass in on the form. How do I get at that information?
Bonus points for anyone who can tell me some way I can visualise data like I might with console.log(some.collection) in Javascript
if request.method == "POST":
book_id = request.POST['book_id']
Assuming you're sure it's in there. Otherwise you'll need to verify/provide a default value like you would for a normal python dictionary.
As for visualising the data, do you mean printing it to the console? In which case if you're running the django runserver you can just do print some_data. If you want it formatted a little nicer, you can use pretty print:
import pprint
pp = pprint.PrettyPrinter()
pp.pprint(some_data)

Django nested formsets

I have an edit object view that contains a formset(one or many if this matters), now I want to create a page that can display multiple edit object forms and submit it in a single form.
What is the correct way to achieve this task?
I found a solution.
I can enumerate my objects on edit page and use different prefixes for formsets based on these indexes. Here is an example:
First, you need enumeration, I achieved it using same input(checkbox) name with incremental values:
<input type="checkbox" name="counter" value="0">
...
<input type="checkbox" name="counter" value="1">
...
Counter numbers is the formset and other data serial numbers:
<!--Ordinary inputs-->
<input type="text" name="data0" value="value0">
<input type="text" name="data1" value="value1">
<!--Formsets-->
<input type="text" id="test0-0-data" name="test0-0-data" value="something">
<input type="text" id="test0-1-data" name="test0-1-data" value="something">
<input type="hidden" name="test0-TOTAL_FORMS" id="id_test0-TOTAL_FORMS" value="2">
<input type="hidden" name="test0-INITIAL_FORMS" id="id_test0-INITIAL_FORMS" value="0">
<input type="text" id="test1-0-data" name="test1-0-data" value="something">
<input type="hidden" name="test1-TOTAL_FORMS" id="id_test1-TOTAL_FORMS" value="1">
<input type="hidden" name="test1-INITIAL_FORMS" id="id_test1-INITIAL_FORMS" value="0">
Then if code you populate formsets like this:
counter = request.POST.getlist('counter')
for i in counter:
TestFormset = modelformset_factory(Test, form=TestForm)
test_formset = TestFormset(request.POST, prefix='test'+i, queryset=Test.objects.none())
I achieved HTML structure above with JavaScript.