Here I have a form that have multiple input values with same name. I want to bulk create objects based on the following template design.
I think the current approach with zipping the list wouldn't work properly if one of the list are unequal.
What will be the better approach ? The front part should be like this as I posted you can check code snippet
<script>
$(document).on("click", ".q-name", function () {
$(this).closest(".untitled").hide();
$(this).siblings('.q-title').prop('hidden', false);
});
</script>
<script>
$(document).on("click", ".addOption", function () {
option = `<div class="item">
<div>
<input
class="form-control"
type="text"
name="title"
placeholder="Enter title"
/>
</div>
<div>
<select name="type" class="form-control">
Select
<option disabled>Select</option>
<option value="1">Option1</option>
<option value="2">Option2</option>
</select>
</div>`;
$(this).closest(".options").prepend(option);
});
$(document).on("click", ".newOptionGroup", function () {
group = `<input type="text" name="q_title" placeholder="model A field" class="form-control q-title"/></div>
<p>Options of that model (Another model fields)</p>
<div class="options">
<div class="item">
<div>
<input
class="form-control"
type="text"
name="title"
placeholder="Enter title"/>
</div>
<div>
<select name="type" class="form-control">
Select
<option disabled>Select</option>
<option value="1">Option1</option>
<option value="2">Option2</option>
</select>
</div>
</div>
<div class="last">
<button type="button" class="btn btn-icon-only addOption">
Add more
</button>
<div>
<div class="custom-control custom-switch">
<input
name="is_document"
type="checkbox"
class="custom-control-input"
id="customSwitche"
value="1"
/>
<label class="custom-control-label" for="customSwitche"
>Is File</label
>
</div>
</div>
<div></div>
</div>
</div>
</div>
<div class="option-group-new newOptionGroup">
<button> Add New group</button>
</div>
</div>
<div class="text-right mt-4">
<button type="submit" class="btn btn-outline-grey">Submit</button>
</div>`;
$(".group-form").append(group);
});
</script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<form class="group-form" method="post">
<input
type="text"
name="q_title"
class="form-control q-title"
placeholder="model A field name"
/>
<p>Options of that model (Another model fields)</p>
</div>
<div class="options">
<div class="item">
<div>
<input
class="form-control"
type="text"
name="title"
placeholder="Enter title"
/>
</div>
<div>
<select name="type" class="form-control">
Select
<option disabled>Select</option>
<option value="1">Option1</option>
<option value="2">Option2</option>
</select>
</div>
</div>
<div class="last">
<button type="button" class="btn btn-icon-only addOption">
Add more
</button>
<div>
<div class="custom-control custom-switch">
<input
name="is_document"
type="checkbox"
class="custom-control-input"
id="customSwitche"
value="1"
/>
<label class="custom-control-label" for="customSwitche"
>Is File</label
>
</div>
</div>
<div></div>
</div>
</div>
</div>
<div class="option-group-new newOptionGroup">
<button type="button"> New group</button>
</div>
</div>
<div class="text-right mt-4">
<button type="submit" class="btn btn-outline-grey">Submit</button>
</div>
</form>
</div>
Django views
ques = Question.objects.get(id=kwargs["q_id"])
q_title = request.POST.getlist("q_title")
title = request.POST.getlist("title")
types = request.POST.getlist("stype")
is_file = request.POST.getlist("is_file", [0])
params = zip(q_title, is_file, title, types)
for p in params:
q = Question.objects.create(
title=p[0],
is_file=p[1],
)
Option.objects.create(title=p[2], field_type=p[3], question=q)
EDIT:
The question titles and Option titles will be unequal since question can have unlimited options.
For example:
questions = ['q1', 'q2']
options = ['q1_option1', 'q1_option2', 'q2_option1', 'q2_option2', 'q2_option3']
I am not being able to track which option will belongs to particular question.
EDIT2:
ques_titles = ['q1-title', 'q2_title']
is_file = [True, False]
# ques_titles and is_file will be equal.
option_titles = ['q1_option1', 'q1_option2', 'q2-option1', 'q2-option2', 'q3-option3']
types = ['option1_type', 'option2_type', 'option3-type', 'option4-type', 'option5-type3']
#option_titles and types list will be equal
from How to handle bulk create with multiple related models?
No comments:
Post a Comment