Я создал модель и функцию представления для добавления посещаемости сотрудника. Но данные не сохраняются в базе данных и не появляется ошибка

Я создал форму с именем AttendanceForm :

class AttendanceForm(forms.ModelForm):
    class Meta:
        model = Attendance
        fields = '__all__'

Это модели

class Employee(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE, default=1)
    eid = models.IntegerField(primary_key=True)
    salary = models.IntegerField()
    gender = models.CharField(max_length=6, choices=GENDER_CHOICES, default=1)
    contactno = models.CharField(max_length=10)
    email = models.CharField(max_length=30)
    country = models.CharField(max_length=30)
    city = models.CharField(max_length=20)
    pincode = models.IntegerField()
    address = models.CharField(max_length=60)

    def __str__(self):
        return self.user.first_name + ' ' + self.user.last_name


class Attendance(models.Model):
    employee = models.ForeignKey(Employee, on_delete=models.CASCADE, default=1)
    attendancedate = models.DateField()
    in_time = models.TimeField()
    out_time = models.TimeField()
    description = models.TextField()

    def __str__(self):
        return str(self.employee)

просмотр для посещаемости.

@csrf_exempt
def addattendance(request):
    form = AttendanceForm()
    emp_list = Employee.objects.all()
    if request.method == 'POST':
        form = AttendanceForm(request.POST)
        if form.is_valid():
            form.save(commit=True)
            return redirect('employee/detail_attendance')

    return render(request, 'employee/addattendance.html', {'form': form, 'emp_list': emp_list})

Я перепробовал все, но не знаю, почему данные не сохраняются в базу данных. Также, модели создаются нормально, и главное, что не возникает никаких ошибок.  Пожалуйста, дайте мне знать, требуются ли какие-либо изменения.

Здесь я изменил некоторые вещи, пожалуйста, проверьте это...

в models.py

GENDER_CHOICES = (('Male','Male'),('Female','Female'))
class Employee(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE, default=1)
    eid = models.IntegerField(primary_key=True)
    salary = models.IntegerField()
    gender = models.CharField(max_length=6, choices=GENDER_CHOICES)
    contactno = models.CharField(max_length=10)
    email = models.CharField(max_length=30)
    country = models.CharField(max_length=30)
    city = models.CharField(max_length=20)
    pincode = models.IntegerField()
    address = models.CharField(max_length=60)

    def __str__(self):
        return self.user.first_name + ' ' + self.user.last_name

class Attendance(models.Model):
    employee = models.ForeignKey(Employee, on_delete=models.CASCADE, default=1)
    attendancedate = models.DateField()
    in_time = models.TimeField()
    out_time = models.TimeField()
    description = models.TextField()

    def __str__(self):
        return str(self.employee)

в файле form.py

from django import forms
from .models import *

class AttendanceForm(forms.ModelForm):
    class Meta:
        model = Attendance
        fields = '__all__'
        widgets= {

            'attendancedate':forms.TextInput(attrs={'type':'date'}),
            'in_time':forms.TextInput(attrs={'type':'time'}),
            'out_time':forms.TextInput(attrs={'type':'time'}),
        }

в файле views.py

from django.shortcuts import render, redirect
from .models import *
from .form import *


def addattendance(request):
    form = AttendanceForm()
    emp_list = Employee.objects.all()
    if request.method == 'POST':
        form = AttendanceForm(request.POST)
        if form.is_valid():
            form.save(commit=True)
            return redirect('employee/detail_attendance')

    return render(request, 'index.html', {'form': form, 'emp_list': emp_list}) 

в HTML

{% block body %}
     <form action="" method="POST">
          {% csrf_token %}
          {{form.as_p}}
          <button type="submit">add</button>
     </form>

{% endblock body %}

Анкета посещаемости

enter image description here

Я могу предложить простое решение с использованием Class-Based-Views:

from django.views.generic.edit import FormView

def AddAttendanceFormView(FormView):
    form_class = AttendanceForm
    extra_context = {"emp_list": Employee.objects.all()}
    success_url = reverse_lazy('employee/detail_attendance')
    template_name = 'employee/addattendance.html'

    def post(self, *args, **kwargs):
        form = self.get_form()
        if form.is_valid():
            return self.form_valid(form)
        return self.form_invalid(form)

Помните, что в urls.py нужно использовать .as_view() для представлений на основе классов, например:

path((...), AddAttendanceFormView.as_view())

Также вам не понадобится @csrf_exempt, просто поместите {% csrf_token %} в любом месте шаблона вашей формы.

Вернуться на верх