提交按钮不适用于Django形式

时间:2020-06-18 08:43:39

标签: python html django forms

我正在尝试使用表格创建员工。我希望在按下提交按钮数据后将其保存到员工列表表,并将页面重定向到员工列表表。当我看到错误日志时,它显示Method Not Allowed (POST)。我认为我的代码很好,但是不知道怎么办。

employee_add_form.html:

{% extends 'base.html' %}
{% block content %}
{% load static %}
<link rel="stylesheet" href="{% static 'employee/css/master.css' %}">

{% load bootstrap4 %}
<div class="">
  <form class="form" action="{% url 'employee:employee-list' %}" method="post" id="employee_add_form">
    {% csrf_token %}

    <!-- {% bootstrap_css %}-->
    {% bootstrap_javascript jquery='full' %}
    {{ form.media }}
    {{ form.non_field_errors }}
    <div class="container">
      <label for=""><b>Personal Info</b></label>
      <div class="border">
        <div class="form-row">
          <div class="col">
            {{ form.first_name.errors }}
            <label for="">First Name</label>
            {{ form.first_name}}
          </div>
          <div class="col">
            {{ form.last_name.errors }}
            <label for="">Last Name</label>
            {{ form.last_name}}
          </div>
          <div class="col">
            {{ form.photo_id.errors }}
            <label for="">Photo ID</label>
            {{ form.photo_id }}
          </div>
        </div>

        <div class="form-row inline">
          <div class="col-4">
            {{ form.gender.errors }}
            <label for="">Gender</label>
            {{ form.gender }}
          </div>
          <div class="col-4">
            {{ form.blood_group.errors }}
            <label for="">Blood Group</label>
            {{ form.blood_group }}
          </div>
          <div class="col-4">
            {{ form.religion.errors }}
            <label for="">Religion</label>
            {{ form.religion }}
          </div>
        </div>

        <div class="form-row">
          <div class="col">
            {{ form.birth_date.errors }}
            <label for="">Date of Birth</label>
            {{ form.birth_date }}
          </div>
        </div>
      </div>
    </div>

    <div class="container">
      <label for=""><b>Contact Info</b></label>
      <div class="border">

        <div class="form-row">
          <div class="col">
            {{ form.email.errors }}
            <label for="">Email</label>
            {{ form.email }}
          </div>
          <div class="col">
            {{ form.phone_number.errors }}
            <label for="">Phone Number</label>
            {{ form.phone_number }}
          </div>
          <div class="col">
            {{ form.address.errors }}
            <label for="">Address</label>
            {{ form.address }}
          </div>
        </div>

      </div>
    </div>

    <div class="container">
      <label for=""><b>Work Info</b></label>
      <div class="border">

        <div class="form-row">
          <div class="col">
            {{ form.e_id.errors }}
            <label for="">Employee ID</label>
            {{ form.e_id }}
          </div>
          <div class="col">
            {{ form.designation.errors }}
            <label for="">Designation</label>
            {{ form.designation }}
          </div>
          <div class="col">
            {{ form.department.errors }}
            <label for="">Department</label>
            {{ form.department }}
          </div>
        </div>

        <div class="form-row">
          <div class="col">
            {{ form.join_date.errors }}
            <label for="">Joining Date</label>
            {{ form.join_date }}
          </div>
        </div>
      </div>
    </div>

    <div class="container">
      <label for=""><b>Attachments</b></label>
      <div class="border">
        <div class="form-group">
          <div class="col">
            {{ form.cv.errors }}
            <label for="">CV</label>
            {{ form.cv }}
          </div>
          <div class="col">
            {{ form.document.errors }}
            <label for="">Documents</label>
            {{ form.document }}
          </div>
          <div class="col">
            {{ form.photo.errors }}
            <label for="">Image</label>
            {{ form.photo }}
          </div>

        </div>
      </div>
    </div>

    <div class="container">
      <button type="submit" class="btn btn-primary">Submit</button>
    </div>

  </form>
</div>
{% endblock %}

views.py:

class EmployeeAddView(CreateView):
    """
    Created new employee
    """
    template_name = 'employee/employee_add_form.html'
    form_class = EmployeeAddModelForm
    # queryset = Employee.objects.all()
    model = Employee

    def form_valid(self, form):
        print(form.cleaned_data)
        return super().form_valid(form)

    def post(self, request, *args, **kwargs):
        form = self.form_class(request.POST)

        if form.is_valid():
            form.save()

            return HttpResponseRedirect('employee:employee-list')
        return render(request, self.template_name, {'form': form})

urls.py:

from django.urls import path
from django.urls import reverse
from . views import (
                    EmployeeListView,
                    EmployeeAddView,
                    EmployeeDetailView,
                    EmployeeUpdateView,
                    EmployeeDeleteView,
                    )

app_name = 'employee'

urlpatterns = [
    path('employee-list/', EmployeeListView.as_view(), name='employee-list'),
    path('employee-add/', EmployeeAddView.as_view(), name='employee-add'),
    path('employee-list/<int:id>/', EmployeeDetailView.as_view(), name='employee-detail'),
    path('employee-list/<int:id>/update/', EmployeeUpdateView.as_view(), name='employee-update'),
    path('employee-list/<int:id>/delete/', EmployeeDeleteView.as_view(), name='employee-delete'),
]

forms.py:

from django import forms
from core.models import Employee
from bootstrap_datepicker_plus import DatePickerInput


class EmployeeAddModelForm(forms.ModelForm):
    use_required_attribute = False
    class Meta:

        model = Employee
        fields = [
            'e_id',
            'first_name',
            'last_name',
            'gender',
            'religion',
            'blood_group',
            'birth_date',
            'photo_id',
            'designation',
            #'employee_type',
            'join_date',
            'address',
            'phone_number',
            'email',
            #'supervisor',
            'bank_account_no',
            'department',
            #'salary_type',
            'cv',
            'document',
            'photo',
        ]
        widgets = {

                'birth_date': DatePickerInput(),
                'join_date': DatePickerInput(),
        }

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)

        # Edit label:
        self.fields['e_id'].label = 'Employee ID'
        self.fields['cv'].label = 'CV'

        # Remove help suggestion
        for fieldname in ['e_id',
                        'first_name',
                        'last_name',
                        'gender',
                        'religion',
                        'blood_group',
                        'birth_date',
                        'photo_id',
                        'designation',
                        #'employee_type',
                        'join_date',
                        'address',
                        'phone_number',
                        'email',
                        #supervisor',
                        'bank_account_no',
                        'department',
                        #'salary_type',
                        'cv',
                        'document',
                        'photo']:
            self.fields[fieldname].help_text = None

3 个答案:

答案 0 :(得分:0)

您的表单发布了错误的URL

  <form class="form" action="{% url 'employee:employee-list' %}" method="post" id="employee_add_form">

应该是

  <form class="form" action="{% url 'employee:employee-add' %}" method="post" id="employee_add_form">

答案 1 :(得分:0)

如果您使用的是基于类的视图,则可以这样做。

class EmployeeAddView(CreateView):

    template_name = 'employee/employee_add_form.html'
    form_class = EmployeeAddModelForm
    queryset = Employee.objects.all()
    success_url = '/employee-list'

def form_valid(self, form):
    print(form.cleaned_data)
    return super().form_valid(form)

答案 2 :(得分:0)

将method =“ post”更改为method =“ POST”即可。我对CBV也有类似的问题。这对我有用。

相关问题