MD Sulaiman
MD Sulaiman

Reputation: 175

How to Submit and Retrieve data in one view in Django?

I have a little confusion in my app.

I have an HTML page in which I have added one form (form data submitting) and one table (to display the submitted data).

For which I have a view that submit and retrieve the data at the same time but unfortunately, data is successfully storing in the table but in retrieving time, it gives me the error which is mentioned below.

Error

NoReverseMatch at /staff/add_staff_type

Reverse for 'student_profile' with keyword arguments '{'id': ''}' not found. 1 pattern(s) tried: ['student/profile/(?P[0-9]+)$']

Views.py

def add_staff_type(request):
    if request.method == 'POST':
        designation = request.POST.get('designation')
        salary = request.POST.get('salary')
        datetime = request.POST.get('datetime')

        add_staff_type = staff_type.objects.create(designation=designation, salary=salary, datetime=datetime)
        add_staff_type.save()  
        messages.info(request, "Staff type has been Added.")
        return redirect('add_staff_type')
    else:
        #fetching records from the database table
        display_staff_type = staff_type.objects.all()
        return render(request, 'staff/staff_type.html',{'display_staff_type':display_staff_type})

urls.py

urlpatterns = [
    path("", views.index, name="index"),
    path("student/Add_Student", views.Add_Student, name="Add_Student"),
    path("student/display_students", views.Display_Student, name="display_students"),
    path("student/edit/<int:id>", views.student_edit, name="student_edit"),
    path("student/update/<int:id>", views.student_update, name="student_update"),
    path("student/profile/<int:id>", views.student_profile, name="student_profile"),
    path("student/delete/<int:id>", views.student_delete, name="student_delete"),
 
    #below url is for staff_type on which i am currently workin
    path("staff/add_staff_type", views.add_staff_type, name="add_staff_type"),
    
]

staff_type.html

<div class="card">
  <div class="card-header">
    <h3 class="card-title">Add Staff Type</h3>
  </div>
  <!-- /.card-header -->
  <!-- form start -->
  <form
    class="needs-validation"
    action="add_staff_type"
    method="POST"
    enctype="multipart/form-data"
    novalidate
  >
    {% csrf_token %}

    <div class="card-body">
      <div class="form-row">
        <div class="col-md-4 mb-3">
          <label for="validationCustom01">Designation</label>
          <input
            type="text"
            class="form-control"
            id="validationCustom01"
            placeholder="Acountant, Librarian, Teacher"
            name="designation"
            required
          />
          <div class="valid-feedback">Looks good!</div>
        </div>

        <div class="col-md-4 mb-3">
  <label for="validationCustom04">Salary</label>
<div class="input-group">
  <div class="input-group-prepend">
    <span class="input-group-text">Rs.</span>
  </div>
  <input type="number" class="form-control" id="validationCustom04" name="salary" min="0">
          <div class="valid-feedback">Looks good!</div>

</div>
</div>


      <div class="col-md-4 mb-3">
        <label for="validationCustom03">Date and Time</label>
        <input
          type="datetime-local"
          class="form-control"
          id="validationCustom03"
          placeholder="MM/DD/YYY"
          name="datetime"
          required
        />
        <div class="valid-feedback">Looks good!</div>
      </div>

      </div>
      <!--
        <div class="form-row">
          <div class="col-md-4 mb-3">
            <label for="validationCustomUsername">Username</label>
            <div class="input-group">
              <div class="input-group-prepend">
                <span class="input-group-text" id="inputGroupPrepend">@</span>
              </div>
              <input type="text" class="form-control" id="validationCustomUsername" placeholder="Username" aria-describedby="inputGroupPrepend" required>
              <div class="invalid-feedback">
                Please choose a username.
              </div>
            </div>
            </div>
            -->
      <button class="btn btn-primary" type="submit">Add Staff Type</button>
    </div>
  </form>
</div>

<div class="card">
        <div class="card-header">
          <h3 class="card-title">Available Staff Types</h3>
        </div>
        <!-- /.card-header -->
        <div class="card-body">
          <table id="example1" class="table table-bordered table-striped">
            <thead>
                <tr>
                    <th>Designation</th>                   
                    <th>Salary</th>                               
                    <th>Entry Date</th>                             
                    <th>Action</th>
                </tr>
            </thead>
            <tbody>
            
                {% for staff_type in display_staff_type %}
                <tr>
                    <td>{{staff_type.designation}}</td>
                    <td>{{staff_type.salary}}</td>
                    <td>{{staff_type.datetime}}</td>                
                    <td>                    
                      <a href="{% url 'student_profile' id=student.id %}">
                       <i class="far fa-eye"></i>
                                  
                    </a>
                    <a href="{% url 'student_edit' id=student.id %}">
                       <i class="far fa-edit"></i>
                               
                    </a>
                    <a href="{% url 'student_delete' id=student.id %}">
                       <i class="far fa-trash-alt"></i>
                                   
                    </a>
                      </td>
                </td>
                </tr>
                {% endfor %}
            
            </tbody>
           
          </table>
        </div>
        <!-- /.card-body -->
      </div>

Upvotes: 0

Views: 366

Answers (1)

kripikroli
kripikroli

Reputation: 46

You can revise your view function to this:

def add_staff_type(request):
    if request.method == 'POST':
        designation = request.POST.get('designation')
        salary = request.POST.get('salary')
        datetime = request.POST.get('datetime')

        add_staff_type = staff_type.objects.create(designation=designation, salary=salary, datetime=datetime)
        add_staff_type.save()  
        messages.info(request, "Staff type has been Added.")
        # this can also be return redirect('staff:add_staff_type')
        return redirect('add_staff_type')
    
    #fetching records from the database table
    display_staff_type = staff_type.objects.all()
    return render(request, 'staff/staff_type.html',{'display_staff_type':display_staff_type})

Since you are calling the same view and serving data to the same form and view you can remove the action value of the form which goes like this:

<form
    class="needs-validation"
    action=""
    method="POST"
    enctype="multipart/form-data"
    novalidate
  >

Upvotes: 1

Related Questions