#html #django #forms #create-view
Вопрос:
Мои взгляды:
class AddSuiteView(CreateView): model = TestSuite form_class = TestSuiteForm def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) my_TestCase = TestCase.objects.all() context['my_testcase'] = my_TestCase return context def get_success_url(self): return reverse("integratedTest:testSuite")
Мой form.py:
class TestSuiteForm(forms.ModelForm): class Meta: model = TestSuite fields = ( 'name', 'test_case_list', 'created_by' )
Моя модель-это:
class TestSuite(models.Model): name = models.CharField(max_length=200) test_case_list = models.CharField(max_length=200, validators=[validate_comma_separated_integer_list], default = "1") created_by = models.CharField(max_length=200, default = "anyone") create_datetime = models.DateTimeField("TestSuite created on", auto_now = True) class TestCase(models.Model): name = models.CharField(max_length=200) .....
Мой html немного сложный:
lt;form method="post"gt; {% csrf_token %} lt;script src="https://code.jquery.com/jquery-3.5.0.min.js"gt;lt;/scriptgt; lt;h1 class="addsuite"gt;Create Test Suite:lt;/h1gt; lt;pgt; lt;label for="id_name"gt;Name:lt;/labelgt; lt;input type="text" id="id_name" name="name" requiredgt;lt;brgt;lt;brgt; lt;/pgt; lt;pgt; lt;label for="id_test_case_list_select_l"gt;test_case_list(double click to add):lt;/labelgt;lt;brgt;lt;brgt; lt;select size=10 name="test_case_list_select_l" id="id_test_case_list_select_l" class="multiselect" multiple="multiple" gt; {%for case in my_testcase %} lt;option value="{{case.name}}" gt;{{case.name}}lt;/optiongt; {%endfor %} lt;/selectgt; lt;brgt;lt;brgt; lt;label for="id_test_case_list_select_r" gt;test case selected(double click to remove):lt;/labelgt;lt;brgt; lt;select size=10 name="test_case_list_select_r" id="id_test_case_list_select_r" class="multiselect" multiple="multiple" gt; lt;/selectgt; lt;input type="hidden" id="id_test_case_list" name="test_case_list" value=""gt; lt;/pgt; lt;pgt;amp;#8679; lt;input type="button" id="addTestcaseByOne" value=" " onclick="addTestcaseByOne"gt; lt;/pgt; lt;pgt;amp;#8681; lt;input type="button" id="decreaseTestcaseByOne" value="--" onclick="decreaseTestcaseByOne"gt; lt;/pgt; lt;brgt;lt;brgt; lt;pgt; lt;label for="id_created_by"gt;created_by:lt;/labelgt; lt;input type="text" id="id_created_by" name="created_by" "gt;lt;brgt;lt;brgt; lt;/pgt; lt;input type="submit" value="Save"gt; lt;/formgt; lt;scriptgt; $(document).ready(function() { $("#id_test_case_list_select_l").dblclick(function() { var selectedItem = $('#id_test_case_list_select_l').find(":selected").text() $('#id_test_case_list_select_r').append ('lt;option value= ' selectedItem '"*1"gt;' selectedItem '*1lt;/optiongt;') var old_val = $('#id_test_case_list').val() //alert("old_val" old_val) var new_val = "" if (old_val.length == 0){ new_val = selectedItem "*1" } else{ new_val = old_val "," selectedItem "*1" } //alert("new_val:" new_val) $('#id_test_case_list').val(new_val) }); }); $(document).ready(function() { $("#id_test_case_list_select_r").dblclick(function() { select_str = $('#id_test_case_list_select_r').find(":selected").text() //alert("select_str:" select_str) var textArry = select_str.split("*") if( textArry.length == 2 ){ var rep = parseInt(textArry[1]) //alert("rep:" rep) if( rep==1 ){ var old_val = $('#id_test_case_list').val() //alert("old_val:" old_val) var indexSel = $("#id_test_case_list_select_r").prop('selectedIndex') //alert("indexSel:" indexSel) var textArry_oldlist = old_val.split(",") var new_val = "" for( let i = 0; i lt; textArry_oldlist.length; i ){ if(i == indexSel){ continue } else{ if (new_val.length == 0){ new_val = textArry_oldlist[i] }else{ new_val = new_val "," textArry_oldlist[i] } } //alert("new_val:" new_val) } //alert("new_val:" new_val) $('#id_test_case_list').val(new_val) $('#id_test_case_list_select_r').find(":selected").remove() } } }); }); $(document).ready(function() { $("#addTestcaseByOne").click(function() { var optionLength = $('#id_test_case_list_select_r').find('option').length if(optionLengthgt;=1){ select_str = $('#id_test_case_list_select_r').find(":selected").text() var textArry = select_str.split("*") if( textArry.length == 2 ){ var rep = parseInt(textArry[1]) 1 var new_text = textArry[0] "*" rep $('#id_test_case_list_select_r').find(":selected").text(new_text) var new_val = textArry[0] "*" rep $('#id_test_case_list_select_r').find(":selected").val(new_val) var indexSel = $("#id_test_case_list_select_r").prop('selectedIndex') //alert("indexSel:" indexSel) var old_val = $('#id_test_case_list').val() //alert("old_val:" old_val) var textArry_oldlist = old_val.split(",") var new_val_list = "" for( let i = 0; i lt; textArry_oldlist.length; i ){ if(i == indexSel){ if (new_val_list.length == 0){ new_val_list = new_val }else{ new_val_list = new_val_list "," new_val } } else{ if (new_val_list.length == 0){ new_val_list = textArry_oldlist[i] }else{ new_val_list = new_val_list "," textArry_oldlist[i] } } } //alert("new_val_list:" new_val_list) $('#id_test_case_list').val(new_val_list) } } }); }); $(document).ready(function() { $("#decreaseTestcaseByOne").click(function() { var optionLength = $('#id_test_case_list_select_r').find('option').length if(optionLengthgt;=1){ select_str = $('#id_test_case_list_select_r').find(":selected").text() var selectedTextSpls = select_str.split("*") if( selectedTextSpls.length == 2 ){ var rep = parseInt(selectedTextSpls[1]) if( repgt;1 ){ rep = rep - 1 var new_text = selectedTextSpls[0] "*" rep $('#id_test_case_list_select_r').find(":selected").text(new_text) var new_val = selectedTextSpls[0] "*" rep $('#id_test_case_list_select_r').find(":selected").val(new_val) var indexSel = $("#id_test_case_list_select_r").prop('selectedIndex') //alert("indexSel:" indexSel) var old_hidden_val = $('#id_test_case_list').val() //alert("old_hidden_val:" old_hidden_val) var textArry_oldlist = old_hidden_val.split(",") var new_val_list = "" for( let i = 0; i lt; textArry_oldlist.length; i ){ if(i == indexSel){ if (new_val_list.length == 0){ new_val_list = new_val }else{ new_val_list = new_val_list "," new_val } } else{ if (new_val_list.length == 0){ new_val_list = textArry_oldlist[i] }else{ new_val_list = new_val_list "," textArry_oldlist[i] } } } //alert("new_val_list:" new_val_list) $('#id_test_case_list').val(new_val_list) }else if( rep==1 ){ var indexSel = $("#id_test_case_list_select_r").prop('selectedIndex') //alert("indexSel:" indexSel) var old_hidden_val = $('#id_test_case_list').val() //alert("old_hidden_val:" old_hidden_val) var textArry_oldlist = old_hidden_val.split(",") var new_val_list = "" for( let i = 0; i lt; textArry_oldlist.length; i ){ if(i == indexSel){ continue } else{ if (new_val_list.length == 0){ new_val_list = textArry_oldlist[i] }else{ new_val_list = new_val_list "," textArry_oldlist[i] } } } //alert("new_val_list:" new_val_list) $('#id_test_case_list').val(new_val_list) $('#id_test_case_list_select_r').find(":selected").remove() } } } }); }); lt;/scriptgt;
Подробности: Верхний выбор списка(имя=»test_case_list_select_l») представляет собой полный список. Дважды щелкнув параметры в верхнем списке, можно добавить одно и то же имя в нижний список(имя=»test_case_list_select_r»), и скрытые входные данные(имя=»test_case_list») получат новое значение. Надеюсь, скрытый ввод обновит список test_case_list
The code seems good to me, but unfortunately it can’t save. After input everything and click save the button, the page never redirect and model TestSuite have no new record. The selected list becomes empty immediately instead.
P.S. My form.html is coming from the Django tutorial:
lt;form method="post"gt; {% csrf_token %} {{ form.as_p }} lt;input type="submit" value="Save"gt; lt;/formgt;
I add an additional button to test the value to be submitted.
lt;input type="submit" value="test" onclick="testButton()"gt;
script as:
function testButton(){ valu = $('#id_test_case_list').val() alert("valu:" valu) }
После выбора некоторых случаев первая кнопка щелчка показывает, что valu-это правильные строки, как я и ожидал. Но выбранный список очищается сразу после нажатия кнопки. При повторном нажатии кнопки testButton значение также отображается пустым.
Я решил эту проблему после того, как изменил модель с test_case_list = models.CharField(max_length=200, validators=[validate_comma_separated_integer_list], default = "1")
Для
test_case_list = models.CharField(max_length=200, default = "1")
с помощью которого я удалил валидаторы=[validate_comma_separated_integer_list]. Я забыл, что это не comma_separated_integer_list, а comma_separated_string_list, я не знал, есть ли какой-либо comma_separated_string_list
Комментарии:
1. Теперь картинка в порядке
2. Надеюсь, кто-нибудь сможет мне помочь
Ответ №1:
действие=»/ваше имя/» отсутствует в теге вашей формы.
lt;form action="/your-route" method="post"gt; . . . lt;button type="submit"gt;Submitlt;/buttongt; lt;/formgt;
Комментарии:
1. Привет, я видел, как в учебнике Djngo приводился пример с lt;методом формы=»сообщение»gt;, в котором не указывалась ссылка на действие с использованием класса CreateView, и структура, похоже, помогает автоматически сохранять все поля.