【发布时间】:2019-10-12 23:23:06
【问题描述】:
型号
attendance_choices = (
('absent', 'Absent'),
('present', 'Present')
)
class Head_of_department(models.Model):
first_name = models.CharField(max_length=200)
last_name = models.CharField(max_length=200)
email = models.CharField(max_length=30)
def __str__(self):
return self.first_name
class Employee(models.Model):
first_name = models.CharField(max_length=200, unique=True)
last_name = models.CharField(max_length=200, unique=True)
head_of_department = models.ForeignKey('Head_of_department', on_delete=models.SET_NULL, blank=True, null=True)
email = models.EmailField(max_length=100)
def __str__(self):
return self.first_name + ' ' + self.last_name
class Attendance(models.Model):
head_of_department = models.ForeignKey('Head_of_department', on_delete=models.SET_NULL, blank=True, null=True)
employee = models.ForeignKey('Employee', on_delete=models.CASCADE, )
attendance = models.CharField(max_length=8, choices=attendance_choices, blank=True)
观看次数
class Attendancecreate(CreateView):
model = Attendance
fields = ['employee']
success_url = '/dashboard/'
def get_context_data(self,** kwargs):
context = super(Attendancecreate, self).get_context_data(**kwargs)
context['formset'] = AttendanceFormset(queryset=Attendance.objects.none())
context['attendance_form'] = Attendanceform()
email = self.request.user.email
hod = Head_of_department.objects.get(email=email)
context["employees"] = Employee.objects.filter(head_of_department =hod)
return context
def get_initial(self):
email = self.request.user.email
hod = Head_of_department.objects.get(email=email)
initial = super(Attendancecreate , self).get_initial()
initial['employee'] = Employee.objects.filter(head_of_department=hod)
return initial
def post(self, request, *args, **kwargs):
formset = AttendanceFormset(request.POST)
if formset.is_valid():
return self.form_valid(formset)
def form_valid(self, formset):
instances = formset.save(commit=False)
for instance in instances:
instance.head_of_department = get_object_or_404(Head_of_department, email=self.request.user.email)
instance.save()
return HttpResponseRedirect('/dashboard/')
表格
class Attendanceform(ModelForm):
class Meta:
model = Attendance
fields = ('employee','attendance','head_of_department')
AttendanceFormset = modelformset_factory(Attendance,fields=('attendance',))
模板
{% csrf_token %}
{{ formset.management_form }}
{% for employee in employees %}
{% for form in formset %}
{{employee.first_name}} {{ form }}
{ % endfor %}<br><br>
{% endfor %}
webapp 具有登录功能。系主任可对出席情况进行标记。员工列表在模板中呈现,没有任何问题,我想将出勤标记为按其 first_name 升序排序的各个员工。
即标记考勤员工将在模板中列出,并在右侧显示所有员工的考勤表格。它只保存一个对象,而不是为员工分配初始值
要求:
【问题讨论】:
-
Django 基于类的视图可以解决非常常见的问题,但不能解决所有问题。
CreateView用于一个对象。正如您所说,您需要一个实现模型表单集(甚至可能是内联模型表单集)的视图,因此请为此创建自己的视图。 -
但是有没有办法在考勤表中将呈现的员工列表作为员工传递?我不知道以这样的方式编写模型表单集,它接受呈现的员工列表作为表单值
-
看看docs。您需要使用已为每个员工设置的初始值创建表单。您不会“通过呈现的员工列表......”。
-
我遵循了文档并使用了 initial (更新了问题),但它没有将初始值分配给出勤,而只保存一个对象。在这约5天
-
AttendanceFormset是用inlineformset_factory创建的吗?然后,当您实例化表单集时,您需要设置初始值:formset = AttendanceFormset(instance=initial_hod, initial=[{'employee': employee} for employee in self.get_initial()['employee'])和post()相同,在其中添加data=request.POST。
标签: python django django-views time-and-attendance