Я создал модель и функцию представления для добавления посещаемости сотрудника. Но данные не сохраняются в базе данных и не появляется ошибка
Я создал форму с именем 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 %}
Анкета посещаемости
Я могу предложить простое решение с использованием 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 %}
в любом месте шаблона вашей формы.