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 %}
Веб-приложение имеет функцию входа в систему. Начальник отдела может отметить посещаемость. Список сотрудников отображается в шаблоне без каких-либо проблем, я хочу отметить посещаемость соответствующих сотрудников, отсортированных в порядке возрастания их first_name.
То есть при отметке посещаемости сотрудники будут перечислены в шаблоне, а справа форма посещаемости будет отображаться для всех сотрудников. Он сохраняет только один объект и не присваивает начальное значение сотруднику.
Требование:
но есть ли способ передать отображаемый список сотрудников в качестве сотрудника в форме посещаемости? Я не знаю, как написать набор форм модели таким образом, чтобы он принимал сотрудников отображаемого списка в качестве значения формы.
Просто посмотрите на документы. Вам необходимо создать формы с уже заданными начальными значениями для каждого сотрудника. Вы не "передаете отображаемый список сотрудников...".
Я следовал документам и использовал начальный (обновил вопрос), но он не присваивает начальное значение посещаемости и сохраняет только один объект. В этом около 5 дней
Создано ли AttendanceFormset
с помощью inlineformset_factory
? Затем, когда вы создаете экземпляр набора форм, вам нужно установить начальный: formset = AttendanceFormset(instance=initial_hod, initial=[{'employee': employee} for employee in self.get_initial()['employee'])
и то же самое для post()
, где вы добавляете data=request.POST
.
нет, это делается с помощью modelformset, я обновил вопрос, пожалуйста, проверьте
Вы должны использовать inlineformset_factory с полями «сотрудник» и «посещаемость». Также не перебирайте сотрудников в своем шаблоне, вам нужно только перебирать формы в наборе форм.
Можете ли вы помочь мне с ответом, я был бы благодарен. Давайте продолжить обсуждение в чате.
После диркгротен мне удалось решить проблему, ответ позволил отобразить список сотрудников в разделе head_of_department (зашел в систему) и отметить соответствующую посещаемость.
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
form_class = Attendanceform
success_url = '/dashboard/'
def get_context_data(self,** kwargs):
context = super(Attendancecreate, self).get_context_data(**kwargs)
context['formset'] = AttendanceFormset(queryset=Attendance.objects.none(), instance=Head_of_department.objects.get(email=self.request.user.email), initial=[{'employee': employee} for employee in self.get_initial()['employee']])
return context
def get_initial(self):
email = self.request.user.email
head_of_department = Head_of_department.objects.get(email=email)
initial = super(Attendancecreate , self).get_initial()
initial['employee'] = Employee.objects.filter(head_of_department=head_of_department)
return initial
def post(self, request, *args, **kwargs,):
formset = AttendanceFormset(request.POST,queryset=Attendance.objects.none(), instance=Head_of_department.objects.get(email=self.request.user.email), initial=[{'employee': employee} for employee in self.get_initial()['employee']])
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
widgets = {'employee' : HiddenInput}
fields = ('employee','attendance','hod')
AttendanceFormset = inlineformset_factory(Head_of_department,Attendance,form=Attendanceform,fields=('attendance','employee'))
{% csrf_token %}
{{ formset.management_form }}
{% for form in formset %}
{{ form.employee.initial }} {{ form.employee}} {{ form.attendance }}
<br><br>
{% endfor %}
Каким был код urls.py или как вы назвали индексную страницу?
path('dashboard/attendance',views.attendance,name='attendance'), ответ основан на прошлогодней версии django, но основной рабочий процесс известен из ответа
Представления на основе классов Django решают очень распространенные задачи, но не решают все.
CreateView
для одного объекта. Как вы сказали, вам нужно представление, которое реализует набор форм модели (или, может быть, даже набор форм встроенной модели), поэтому создайте для этого собственное представление.