Html Form Posting Values to Django Backend only when submitted twice, or rather hit back to form and then submit again

huangapple go评论102阅读模式
英文:

Html Form Posting Values to Django Backend only when submitted twice, or rather hit back to form and then submit again

问题

这是你提供的代码的翻译部分:

问题描述: 我遇到了一个情况,当我点击提交按钮后,表单不会在第一次点击时提交值,它确实跳转到下一个页面,但我的Django视图无法获取POST的值。但是,当我在浏览器上点击返回按钮然后再次点击提交按钮时,它可以工作;然后我可以在我的DJango视图中看到POST的值。

HTML表单部分:

  1. <form action="" method="POST" id="quizform">
  2. {% csrf_token %}
  3. <fieldset class="cfield" id="box1">
  4. <p id="question" class="fs-title">1. {{data.0.question}}</p>
  5. <!-- ... 这里省略了一些HTML代码 ... -->
  6. <button type="button" title="回答此问题以启用按钮" name="next" class="mybtn" id="nextpage" disabled>下一页 <i class="fas fa-arrow-right"></i></button>
  7. <button type="submit" name="" class="mybtn" id="submitbtn">提交</button>
  8. </fieldset>
  9. </form>

JavaScript部分:

  1. <script>
  2. var x = {{datalength}};
  3. $('#submitbtn').hide()
  4. var y = 1;
  5. $('#nextpage').click(() => {
  6. $('#nextpage').prop('disabled', true);
  7. $('#nextpage').prop('title', "回答此问题以启用按钮");
  8. var next;
  9. if (x != y) {
  10. next = y + 1;
  11. $(`#box${y}`).hide()
  12. $(`#box${next}`).show()
  13. if (y < x) {
  14. ++y;
  15. }
  16. }
  17. if (y == x) {
  18. $('#nextpage').hide();
  19. $('#submitbtn').show();
  20. }
  21. })
  22. $('#previspage').click(() => {
  23. $('#submitbtn').hide();
  24. $('#nextpage').show();
  25. var pre = y - 1;
  26. if (pre <= 0) {
  27. return false;
  28. } else {
  29. $(`#box${pre}`).show()
  30. $(`#box${y}`).hide()
  31. if (y > pre) {
  32. --y;
  33. }
  34. }
  35. })
  36. </script>
  37. <script>
  38. // 答案提交处理程序
  39. $('.ans').change(function (e) {
  40. var $choice = $(this);
  41. var qid = $choice.attr('qid');
  42. var choice = $choice.val();
  43. var next_btn = document.getElementById('nextpage');
  44. $.ajax({
  45. type: 'GET',
  46. url: '/check-answer/' + qid + '/',
  47. success: function (data) {
  48. $('input[qid=' + qid + ']').each(function (index, obj) {
  49. var image = document.getElementById("a" + (index + 1) + "-icon-" + qid);
  50. $(obj).prop('disabled', true);
  51. if ($(obj).val() === data.correct && $(obj).val()) {
  52. if ($(obj).val() == choice) {
  53. image.src = '/static/assets/img/correctcolored.png';
  54. } else {
  55. image.src = '/static/assets/img/correct.png';
  56. }
  57. image.hidden = false;
  58. } else {
  59. if ($(obj).val() == choice) {
  60. image.src = '/static/assets/img/wrongcolored.png';
  61. } else {
  62. image.src = '/static/assets/img/wrong.png';
  63. }
  64. image.hidden = false;
  65. }
  66. });
  67. $('#nextpage').prop('disabled', false);
  68. $('#nextpage').prop('title', "");
  69. },
  70. error: function (error) {
  71. console.log(error);
  72. },
  73. });
  74. });
  75. $('.multipleans').click(function (e) {
  76. var $submit = $(this);
  77. var qid = $submit.attr('qid');
  78. var $answer1 = document.getElementById("correct_answer1" + qid);
  79. var $answer2 = document.getElementById("correct_answer2" + qid);
  80. console.log($answer1.value);
  81. $.ajax({
  82. type: 'GET',
  83. url: '/check-answer/' + qid + '/',
  84. success: function (data) {
  85. console.log(data.correct2);
  86. var image1 = document.getElementById("c1-icon-" + qid);
  87. var image2 = document.getElementById("c2-icon-" + qid);
  88. if ($answer1.value === data.correct || $answer1.value === data.correct2) {
  89. image1.src = '/static/assets/img/correctcolored.png';
  90. } else {
  91. console.log("test");
  92. image1.src = '/static/assets/img/wrongcolored.png';
  93. }
  94. image1.hidden = false;
  95. if (($answer2.value === data.correct || $answer2.value === data.correct2) && $answer1.value != $answer2.value) {
  96. image2.src = '/static/assets/img/correctcolored.png';
  97. } else {
  98. image2.src = '/static/assets/img/wrongcolored.png';
  99. }
  100. image2.hidden = false;
  101. $('#nextpage').prop('disabled', false);
  102. $('#nextpage').prop('title', "");
  103. $('input[qid=' + qid + ']').each(function (index, obj) {
  104. var image = document.getElementById("a" + (index + 1) + "-icon-" + qid);
  105. $(obj).prop('disabled', true);
  106. if ($(obj).val() === data.correct || $(obj).val() === data.correct2) {
  107. image.src = '/static/assets/img/correct.png';
  108. image.hidden = false;
  109. } else {
  110. image.src = '/static/assets/img/wrong.png';
  111. image.hidden = false;
  112. }
  113. });
  114. },
  115. error: function (error) {
  116. console.log(error);
  117. },
  118. });
  119. });
  120. </script>

你提供的代码涉及到HTML表单和JavaScript。如果你需要更多帮助或有其他问题,请告诉我。

英文:

So I have stumbled upon a case where my form does not post values after I click the submit button once, it goes to the next page indeed but my Django View can not fetch the post values.

But soon after I hit back button on browser and then clicks the submit button again it works ; I can then see the POSTed values in my DJango Views.

Here's my HTML form. (Please note I have removed the unnecessary code which is long)

  1. &lt;form action=&quot;&quot; method=&quot;POST&quot; id=&quot;quizform&quot;&gt;
  2. {% csrf_token %}
  3. &lt;fieldset class=&quot;cfield&quot; id=&quot;box1&quot;&gt;
  4. &lt;p id=&quot;question&quot; class=&quot;fs-title&quot;&gt; 1. {{data.0.question}}&lt;/p&gt;
  5. &lt;div class=&quot;row&quot;&gt;
  6. &lt;div class=&quot;{% if data.0.correct_answer2 == &quot;&quot; %}col-12{% else %}col-9{% endif %}&quot;&gt;
  7. &lt;div class=&quot;form-check&quot;&gt;
  8. &lt;label class=&quot;form-check-label&quot;&gt; &lt;img id=&quot;a1-icon-{{data.0.pk}}&quot; src=&quot;/static/assets/img/correct.png&quot; class=&quot;answer_icon&quot; width=&quot;20px&quot; style=&quot;z-index: 99;&quot; hidden&gt;
  9. &lt;input id=&quot;a1{{data.pk}}&quot; style=&quot;z-index: -1;&quot; type=&quot;radio&quot; class=&quot;radiobox form-check-input radio-box ans&quot; name=&quot;q{{data.0.pk}}&quot; qid=&quot;{{ data.0.pk }}&quot; value=&quot;{{data.0.a1}}&quot; required {% if data.0.correct_answer2 != &quot;&quot; %}disabled{% endif %}&gt;
  10. &lt;span class=&quot;cspan&quot; style=&quot;color: white;&quot;&gt;TES&lt;/span&gt;
  11. &lt;/label&gt;
  12. &lt;span id=&quot;a1&quot; class=&quot;cspan&quot;&gt;{% if data.0.a1_image.url != None %}&lt;img src=&quot;{{ data.0.a1_image.url }}&quot; class=&quot;&quot; width=&quot;100px&quot;&gt;{% endif %} {{data.0.a1}} &lt;/span&gt;
  13. &lt;/div&gt;
  14. &lt;div class=&quot;form-check&quot;&gt;
  15. &lt;label class=&quot;form-check-label&quot;&gt;&lt;img id=&quot;a2-icon-{{data.0.pk}}&quot; src=&quot;/static/assets/img/correct.png&quot; class=&quot;answer_icon&quot; width=&quot;20px&quot; style=&quot;z-index: 99;&quot; hidden&gt;
  16. &lt;input id=&quot;a2{{data.pk}}&quot; style=&quot;z-index: -1;&quot; type=&quot;radio&quot; class=&quot;radiobox form-check-input radio-box ans&quot; name=&quot;q{{data.0.pk}}&quot; qid=&quot;{{ data.0.pk }}&quot; value=&quot;{{data.0.a2}}&quot; required {% if data.0.correct_answer2 != &quot;&quot; %}disabled{% endif %}&gt;
  17. &lt;span class=&quot;cspan&quot; style=&quot;color: white;&quot;&gt;TES&lt;/span&gt;
  18. &lt;/label&gt;
  19. &lt;span id=&quot;a1&quot; class=&quot;cspan&quot;&gt;{% if data.0.a2_image.url != None %}&lt;img src=&quot;{{ data.0.a2_image.url }}&quot; class=&quot;&quot; width=&quot;100px&quot;&gt;{% endif %} {{data.0.a2}} &lt;/span&gt;
  20. &lt;/div&gt;
  21. &lt;div class=&quot;form-check&quot;&gt;
  22. &lt;label class=&quot;form-check-label&quot;&gt;&lt;img id=&quot;a3-icon-{{data.0.pk}}&quot; src=&quot;/static/assets/img/correct.png&quot; class=&quot;answer_icon&quot; width=&quot;20px&quot; style=&quot;z-index: 99;&quot; hidden&gt;
  23. &lt;input id=&quot;a3{{data.pk}}&quot; style=&quot;z-index: -1;&quot; type=&quot;radio&quot; class=&quot;radiobox form-check-input radio-box ans&quot; name=&quot;q{{data.0.pk}}&quot; qid=&quot;{{ data.0.pk }}&quot; value=&quot;{{data.0.a3}}&quot; required {% if data.0.correct_answer2 != &quot;&quot; %}disabled{% endif %}&gt;
  24. &lt;span class=&quot;cspan&quot; style=&quot;color: white;&quot;&gt;TES&lt;/span&gt;
  25. &lt;/label&gt;
  26. &lt;span id=&quot;a1&quot; class=&quot;cspan&quot;&gt;{% if data.0.a3_image.url != None %}&lt;img src=&quot;{{ data.0.a3_image.url }}&quot; class=&quot;&quot; width=&quot;100px&quot;&gt;{% endif %} {{data.0.a3}} &lt;/span&gt;
  27. &lt;/div&gt;
  28. &lt;div class=&quot;form-check&quot;&gt;
  29. &lt;label class=&quot;form-check-label&quot;&gt;&lt;img id=&quot;a4-icon-{{data.0.pk}}&quot; src=&quot;/static/assets/img/correct.png&quot; class=&quot;answer_icon&quot; width=&quot;20px&quot; style=&quot;z-index: 99;&quot; hidden&gt;
  30. &lt;input id=&quot;a4{{data.pk}}&quot; style=&quot;z-index: -1;&quot; type=&quot;radio&quot; class=&quot;radiobox form-check-input radio-box ans&quot; name=&quot;q{{data.0.pk}}&quot; qid=&quot;{{ data.0.pk }}&quot; value=&quot;{{data.0.a4}}&quot; required {% if data.0.correct_answer2 != &quot;&quot; %}disabled{% endif %}&gt;
  31. &lt;span class=&quot;cspan&quot; style=&quot;color: white;&quot;&gt;TES&lt;/span&gt;
  32. &lt;/label&gt;
  33. &lt;span id=&quot;a1&quot; class=&quot;cspan&quot;&gt;{% if data.0.a4_image.url != None %}&lt;img src=&quot;{{ data.0.a4_image.url }}&quot; class=&quot;&quot; width=&quot;100px&quot;&gt;{% endif %} {{data.0.a4}} &lt;/span&gt;
  34. &lt;/div&gt;
  35. {% if data.0.a5 != &quot;&quot; %}
  36. &lt;div class=&quot;form-check&quot;&gt;
  37. &lt;label class=&quot;form-check-label&quot;&gt;&lt;img id=&quot;a5-icon-{{data.0.pk}}&quot; src=&quot;/static/assets/img/correct.png&quot; class=&quot;answer_icon&quot; width=&quot;20px&quot; style=&quot;z-index: 99;&quot; hidden&gt;
  38. &lt;input id=&quot;a5{{data.pk}}&quot; style=&quot;z-index: -1;&quot; type=&quot;radio&quot; class=&quot;radiobox form-check-input radio-box ans&quot; name=&quot;q{{data.0.pk}}&quot; qid=&quot;{{ data.0.pk }}&quot; value=&quot;{{data.0.a5}}&quot; required {% if data.0.correct_answer2 != &quot;&quot; %}disabled{% endif %}&gt;
  39. &lt;span class=&quot;cspan&quot; style=&quot;color: white;&quot;&gt;TES&lt;/span&gt;
  40. &lt;/label&gt;
  41. &lt;span id=&quot;a5&quot; class=&quot;cspan&quot;&gt;{% if data.0.a5_image.url != None %}&lt;img src=&quot;{{ data.0.a5_image.url }}&quot; class=&quot;&quot; width=&quot;100px&quot;&gt;{% endif %} {{data.0.a5}} &lt;/span&gt;
  42. &lt;/div&gt;
  43. {% endif %}
  44. &lt;/div&gt;
  45. {% if data.0.correct_answer2 != &quot;&quot; %}
  46. &lt;div class=&quot;col-3&quot;&gt;
  47. &lt;br&gt;
  48. &lt;div class=&quot;form-group&quot;&gt;
  49. &lt;img id=&quot;c1-icon-{{data.0.pk}}&quot; src=&quot;/static/assets/img/correct.png&quot; class=&quot;select_icon&quot; width=&quot;20px&quot; style=&quot;z-index: 99;&quot; hidden&gt;
  50. &lt;select name=&quot;correct_answer1{{data.0.pk}}&quot; id=&quot;correct_answer1{{data.0.pk}}&quot; class=&quot;form-control&quot;&gt;
  51. &lt;option&gt;select&lt;/option&gt;
  52. &lt;option value=&quot;{{data.0.a1}}&quot; data-ans-no=&quot;a1&quot;&gt;{{data.0.a1}}&lt;/option&gt;
  53. &lt;option value=&quot;{{data.0.a2}}&quot; data-ans-no=&quot;a2&quot;&gt;{{data.0.a2}}&lt;/option&gt;
  54. &lt;option value=&quot;{{data.0.a3}}&quot; data-ans-no=&quot;a3&quot;&gt;{{data.0.a3}}&lt;/option&gt;
  55. &lt;option value=&quot;{{data.0.a4}}&quot; data-ans-no=&quot;a4&quot;&gt;{{data.0.a4}}&lt;/option&gt;
  56. {% if data.0.a5 != &quot;&quot; %}
  57. &lt;option value=&quot;{{data.0.a5}}&quot; data-ans-no=&quot;a4&quot;&gt;{{data.0.a5}}&lt;/option&gt;
  58. {% endif %}
  59. &lt;/select&gt;
  60. &lt;/div&gt;
  61. &lt;div class=&quot;form-group&quot;&gt;
  62. &lt;img id=&quot;c2-icon-{{data.0.pk}}&quot; src=&quot;/static/assets/img/correct.png&quot; class=&quot;select_icon&quot; width=&quot;20px&quot; style=&quot;z-index: 99;&quot; hidden&gt;
  63. &lt;select name=&quot;correct_answer2{{data.0.pk}}&quot; id=&quot;correct_answer2{{data.0.pk}}&quot; data-ans-no=&quot;asd&quot; qid=&quot;{{ data.0.pk }}&quot; class=&quot;form-control&quot;&gt;
  64. &lt;option&gt;select&lt;/option&gt;
  65. &lt;option value=&quot;{{data.0.a1}}&quot; data-ans-no=&quot;a1&quot;&gt;{{data.0.a1}}&lt;/option&gt;
  66. &lt;option value=&quot;{{data.0.a2}}&quot; data-ans-no=&quot;a2&quot;&gt;{{data.0.a2}}&lt;/option&gt;
  67. &lt;option value=&quot;{{data.0.a3}}&quot; data-ans-no=&quot;a3&quot;&gt;{{data.0.a3}}&lt;/option&gt;
  68. &lt;option value=&quot;{{data.0.a4}}&quot; data-ans-no=&quot;a4&quot;&gt;{{data.0.a4}}&lt;/option&gt;
  69. {% if data.a5 != &quot;&quot; %}
  70. &lt;option value=&quot;{{data.0.a5}}&quot; data-ans-no=&quot;a4&quot;&gt;{{data.0.a5}}&lt;/option&gt;
  71. {% endif %}
  72. &lt;/select&gt;
  73. &lt;/div&gt;
  74. &lt;input class=&quot;btn btn-success multipleans&quot; qid=&quot;{{ data.0.pk }}&quot; type=&quot;button&quot; value=&quot;submit&quot;&gt;
  75. &lt;/div&gt;
  76. {% endif %}
  77. &lt;/div&gt;
  78. &lt;/fieldset&gt;
  79. &lt;button type=&quot;button&quot; title=&quot;answer this question to enable the button&quot; name=&quot;next&quot; class=&quot;mybtn&quot; id=&quot;nextpage&quot; disabled&gt; Next &lt;i class=&quot;fas fa-arrow-right&quot;&gt;&lt;/i&gt;&lt;/button&gt;
  80. &lt;button type=&quot;submit&quot; name=&quot;&quot; class=&quot;mybtn&quot; id=&quot;submitbtn&quot; &gt; Submit&lt;/button&gt;
  81. &lt;/form&gt;

Below is the Javascript :

  1. &lt;script&gt;
  2. var x={{datalength}};
  3. $(&#39;#submitbtn&#39;).hide()
  4. var y=1;
  5. $(&#39;#nextpage&#39;).click(()=&gt;{
  6. $(&#39;#nextpage&#39;).prop(&#39;disabled&#39;,true);
  7. $(&#39;#nextpage&#39;).prop(&#39;title&#39;,&quot;answer this question to enable the button&quot;);
  8. var next;
  9. if(x !=y){
  10. next=y+1;
  11. $(`#box${y}`).hide()
  12. $(`#box${next}`).show()
  13. if(y&lt;x){
  14. ++y;
  15. }
  16. }
  17. if(y==x){
  18. $(&#39;#nextpage&#39;).hide();
  19. $(&#39;#submitbtn&#39;).show();
  20. }
  21. })
  22. $(&#39;#previspage&#39;).click(()=&gt;{
  23. $(&#39;#submitbtn&#39;).hide();
  24. $(&#39;#nextpage&#39;).show();
  25. var pre=y-1;
  26. // $(&#39;#nextpage&#39;).hide();
  27. // alert(x)
  28. if(pre&lt;=0){
  29. return false;
  30. }
  31. else{
  32. $(`#box${pre}`).show()
  33. $(`#box${y}`).hide()
  34. if(y&gt;pre){
  35. --y;
  36. }
  37. }
  38. })
  39. &lt;/script&gt;
  40. &lt;script&gt;
  41. // Answer submit handler
  42. $(&#39;.ans&#39;).change(function (e) {
  43. var $choice = $(this);
  44. var qid = $choice.attr(&#39;qid&#39;);
  45. var choice = $choice.val();
  46. var next_btn = document.getElementById(&#39;nextpage&#39;);
  47. $.ajax({
  48. type: &#39;GET&#39;,
  49. url: &#39;/check-answer/&#39; + qid + &#39;/&#39;,
  50. success: function (data) {
  51. $(&#39;input[qid=&#39; + qid + &#39;]&#39;).each(function (index, obj) {
  52. var image = document.getElementById(&quot;a&quot;+(index+1)+&quot;-icon-&quot;+qid)
  53. $(obj).prop(&#39;disabled&#39;, true);
  54. if ($(obj).val() === data.correct &amp;&amp; $(obj).val()) {
  55. if($(obj).val() == choice){
  56. image.src = &#39;/static/assets/img/correctcolored.png&#39;;
  57. }else{
  58. image.src = &#39;/static/assets/img/correct.png&#39;;
  59. }
  60. image.hidden = false;
  61. } else {
  62. if($(obj).val() == choice){
  63. image.src = &#39;/static/assets/img/wrongcolored.png&#39;;
  64. }else{
  65. image.src = &#39;/static/assets/img/wrong.png&#39;;
  66. }
  67. image.hidden = false;
  68. }
  69. });
  70. $(&#39;#nextpage&#39;).prop(&#39;disabled&#39;,false);
  71. $(&#39;#nextpage&#39;).prop(&#39;title&#39;,&quot;&quot;);
  72. },
  73. error: function (error) {
  74. console.log(error);
  75. },
  76. });
  77. });
  78. $(&#39;.multipleans&#39;).click(function (e) {
  79. var $submit = $(this);
  80. var qid = $submit.attr(&#39;qid&#39;);
  81. var $answer1 = document.getElementById(&quot;correct_answer1&quot;+qid);
  82. var $answer2 = document.getElementById(&quot;correct_answer2&quot;+qid);
  83. console.log($answer1.value)
  84. $.ajax({
  85. type: &#39;GET&#39;,
  86. url: &#39;/check-answer/&#39; + qid + &#39;/&#39;,
  87. success: function (data) {
  88. console.log(data.correct2)
  89. var image1 = document.getElementById(&quot;c1-icon-&quot;+qid)
  90. var image2 = document.getElementById(&quot;c2-icon-&quot;+qid)
  91. if ($answer1.value === data.correct || $answer1.value === data.correct2){
  92. image1.src = &#39;/static/assets/img/correctcolored.png&#39;;
  93. }else{
  94. console.log(&quot;test&quot;)
  95. image1.src = &#39;/static/assets/img/wrongcolored.png&#39;;
  96. }
  97. image1.hidden = false;
  98. if (($answer2.value === data.correct || $answer2.value === data.correct2) &amp;&amp; $answer1.value != $answer2.value ){
  99. image2.src = &#39;/static/assets/img/correctcolored.png&#39;;
  100. }else{
  101. image2.src = &#39;/static/assets/img/wrongcolored.png&#39;;
  102. }
  103. image2.hidden = false;
  104. $(&#39;#nextpage&#39;).prop(&#39;disabled&#39;,false);
  105. $(&#39;#nextpage&#39;).prop(&#39;title&#39;,&quot;&quot;);
  106. $(&#39;input[qid=&#39; + qid + &#39;]&#39;).each(function (index, obj) {
  107. var image = document.getElementById(&quot;a&quot;+(index+1)+&quot;-icon-&quot;+qid)
  108. $(obj).prop(&#39;disabled&#39;, true);
  109. if ($(obj).val() === data.correct || $(obj).val() === data.correct2) {
  110. image.src = &#39;/static/assets/img/correct.png&#39;;
  111. image.hidden = false;
  112. } else {
  113. image.src = &#39;/static/assets/img/wrong.png&#39;;
  114. image.hidden = false;
  115. }
  116. });
  117. },
  118. error: function (error) {
  119. console.log(error);
  120. },
  121. });
  122. });
  123. &lt;/script&gt;

I don't think the view has any problem as it is fetching the value correctly only after second form submit.

I had a look at this post , which is quite relevant problem, but I don't think I have any conflicting event handlers.

答案1

得分: 0

经过大量的调试后,我想到了一个有效的解决方案。

首先,我创建了表单的一个副本:

  1. var userSubmissionForm = document.getElementById('quizform');

然后,我将表单输入元素添加到这个副本中:

  1. const hiddenField = document.createElement('input');
  2. hiddenField.setAttribute('type', 'hidden');
  3. hiddenField.setAttribute('name', "q" + qid);
  4. hiddenField.setAttribute('value', choice);
  5. userSubmissionForm.appendChild(hiddenField);

最后,我在单击提交按钮时提交了新表单:

  1. userSubmissionForm.submit();

但我仍然不确定为什么第一次提交没有生效。

英文:

So after a lot of debugging I thought of a solution which worked.

Firstly I created a copy of the form.

  1. var userSubmissionForm = document.getElementById(&#39;quizform&#39;);

Then I added the form input elements to this copy.

  1. const hiddenField = document.createElement(&#39;input&#39;);
  2. hiddenField.setAttribute(&#39;type&#39;, &#39;hidden&#39;);
  3. hiddenField.setAttribute(&#39;name&#39;, &quot;q&quot;+qid);
  4. hiddenField.setAttribute(&#39;value&#39;, choice);
  5. userSubmissionForm.appendChild(hiddenField);

Lastly I submitted the newform upon clicking the submit button.

  1. userSubmissionForm.submit();

But I am still unsure why the first submit did not work.

huangapple
  • 本文由 发表于 2023年3月4日 05:28:08
  • 转载请务必保留本文链接:https://go.coder-hub.com/75632024.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定