【问题标题】:How to Submit and Retrieve data in one view in Django?如何在 Django 的一个视图中提交和检索数据?
【发布时间】:2021-07-03 19:20:32
【问题描述】:

我的应用有点混乱。

我有一个 HTML 页面,其中添加了一个 form(表单数据提交)和一个 table(用于显示提交的数据)。

为此,我有一个同时提交和检索数据的视图,但不幸的是,数据已成功存储在表中,但在检索时,它给了我下面提到的错误。

错误

/staff/add_staff_type 处的 NoReverseMatch

对于带有关键字参数“{'id': ''}' 的 'student_profile' 不是 成立。尝试了 1 种模式:['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>

【问题讨论】:

  • 您的问题可能是由于使用了student.id 而不是staff_type.id。 Django 说要创建 URL student/profile/1,它需要将 id 转换为整数。但它发现id 的值为'',它不是整数。
  • @Abdou 糟糕,我忘了更改 student.id。谢谢
  • @Abdou 请回答这个问题stackoverflow.com/questions/68334466/…

标签: python django


【解决方案1】:

您可以将视图功能修改为:

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})

由于您调用相同的视图并将数据提供给相同的表单和视图,因此您可以删除表单的操作值,如下所示:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-09-20
    • 2022-07-18
    • 2019-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-14
    相关资源
    最近更新 更多