Django UpdateView didn't update page

210 Views Asked by At

My form:

class TestCaseUpdateForm(forms.ModelForm):
    class Meta:
        model = TestCase
        fields = ( 'name', 'executable', 'parameter_list', 'executable_type', 'test_type' , 'project_name', 'created_by')

My views:

class EditCaseView(UpdateView):
    model = TestCase
    form_class = TestCaseUpdateForm 
    template_name_suffix = '_update_form' 
    
    def get_context_data(self, **kwargs):    
        context = super().get_context_data(**kwargs)
        pk = self.kwargs.get(self.pk_url_kwarg)
        queryset = self.get_queryset().filter(pk=pk)
        case = queryset.get()
        context['my_case'] = case
        context['my_exetype'] = TestCase.EXECUTABLE_TYPE_CHOICES
        context['my_ttype'] = TestCase.TEST_TYPE_CHOICES        
        context['projnames'] = PROJNAME_CHOICES       
        return context  
        
    def get_success_url(self):  
        print("get_success_url")
        return reverse("integratedTest:testCase")

My model:

PROJNAME_CHOICES = (
        ('Name1', 'Name1'), 
        ('Name2','Name2'),
        ('Name3','Name3')
)

class TestCase(models.Model):
    EXECUTABLE_TYPE_CHOICES = (
        ('e_type1', 'e_type1'),
        ('e_type2', 'e_type2'), 
        ('e_type3', 'e_type3'),
    )
    TEST_TYPE_CHOICES = (
        ('t_type1', 't_type1'), 
        ('t_type2','t_type2'),
        ('others', 'others'),
    )
    name = models.CharField(max_length=200, unique=True)
    executable = models.CharField(max_length=1023) 
    parameter_list = models.TextField(blank=True, default = "")
    project_name = models.CharField(max_length=200, choices = PROJNAME_CHOICES, default="Name1")
    executable_type = models.CharField(max_length=200, choices = EXECUTABLE_TYPE_CHOICES, default = "e_type1")    
    test_type = models.CharField(max_length=200, choices = TEST_TYPE_CHOICES, default = "t_type1") 
    created_by = models.CharField(max_length=200, default = "sb")     
    create_datetime = models.DateTimeField("testcase created on", auto_now = True)

My template:

<form method="post">{% csrf_token %}

<h1 >Edit Test Case:</h1>
<table>  
  <tr>
      <th>Name:</th>
      <th>executable:</th>
      <th>parameter_list:</th>
  </tr>
  <tr>
      <td><input type="text" id="id_name" name="name" value = "{{my_case.name}}" 
      placeholder="short_unique_string" required>
      </td>
      <td>
         <input type="text" id="id_executable" name="executable" value = "{{my_case.executable}}" 
         placeholder="FilenameWithoutPath.py" required>
      </td>
      <td><textarea id="id_parameter_list" name="parameter_list" value = "{{my_case.parameter_list}}"  
        placeholder="Copy your parameter string here directly"></textarea>
      </td>
  </tr>

  <tr>
      <th>executable_type:</th>
      <th>test_type:</th>
      <th>project_name:</th>
      <th>created_by:</th>
  </tr>
  <tr>
      <td>
      <select name="executable_type" id="id_executable_type" required>  
       {%for key, value in my_exetype %}
          {%if my_case.executable_type == key %}
            <option value={{value}} selected>{{key}}</option>
          {%else%}
            <option value={{value}}>{{key}}</option>      
          {%endif%}
        {%endfor%}      
      </select>
      </td>
      <td>
      <select name="test_type" id="id_test_type" required>  
        {%for key, value in my_ttype %}
          {%if my_case.test_type == key %}
            <option value={{value}} selected>{{key}}</option>
          {%else%}
            <option value={{value}}>{{key}}</option>      
          {%endif%}
        {%endfor%}    
      </select> 
      </td>
      <td> 
      <select name="project_name" id="id_project_name" >  
        {%for key, value in projnames %}
          {%if my_case.project_name == key %}
            <option value={{value}} selected>{{key}}</option>
          {%else%}
            <option value={{value}}>{{key}}</option>      
          {%endif%}
        {%endfor%}
      </select>
      </td>
      
      <td><input type="text" id="id_created_by" name="created_by" value = "{{my_case.created_by}}"
      placeholder="some name like 'sb'" required></td>
  </tr>

</table> 
       {% for i in form.errors %}
{{i}}
{% endfor %}
<br>
{% if form.errors %}
error!
{% endif %}   
        <input type="submit" value="Update">
</form>

MY issue: The page displays well. I changed something and clicked update. The page refreshed to unchanged page, without calling get_success_url() as I expected. I checked the database, record didn't update either. I checked the template again and again but didn't find error. enter image description here

Following Selcuk advice, I add print form.errors. When the editing page is display, it prints all field names as error like below: enter image description here

When I update, print as: enter image description here

I'm not sure what's that means.

0

There are 0 best solutions below