Система посещаемости с использованием Django

Модели

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.

То есть при отметке посещаемости сотрудники будут перечислены в шаблоне, а справа форма посещаемости будет отображаться для всех сотрудников. Он сохраняет только один объект и не присваивает начальное значение сотруднику.

Требование:

Система посещаемости с использованием Django

Представления на основе классов Django решают очень распространенные задачи, но не решают все. CreateView для одного объекта. Как вы сказали, вам нужно представление, которое реализует набор форм модели (или, может быть, даже набор форм встроенной модели), поэтому создайте для этого собственное представление.

dirkgroten 27.05.2019 13:31

но есть ли способ передать отображаемый список сотрудников в качестве сотрудника в форме посещаемости? Я не знаю, как написать набор форм модели таким образом, чтобы он принимал сотрудников отображаемого списка в качестве значения формы.

Joel Deleep 27.05.2019 13:33

Просто посмотрите на документы. Вам необходимо создать формы с уже заданными начальными значениями для каждого сотрудника. Вы не "передаете отображаемый список сотрудников...".

dirkgroten 27.05.2019 13:38

Я следовал документам и использовал начальный (обновил вопрос), но он не присваивает начальное значение посещаемости и сохраняет только один объект. В этом около 5 дней

Joel Deleep 28.05.2019 07:42

Создано ли AttendanceFormset с помощью inlineformset_factory? Затем, когда вы создаете экземпляр набора форм, вам нужно установить начальный: formset = AttendanceFormset(instance=initial_hod, initial=[{'employee': employee} for employee in self.get_initial()['employee']) и то же самое для post(), где вы добавляете data=request.POST.

dirkgroten 28.05.2019 09:53

нет, это делается с помощью modelformset, я обновил вопрос, пожалуйста, проверьте

Joel Deleep 28.05.2019 09:56

Вы должны использовать inlineformset_factory с полями «сотрудник» и «посещаемость». Также не перебирайте сотрудников в своем шаблоне, вам нужно только перебирать формы в наборе форм.

dirkgroten 28.05.2019 09:58

Можете ли вы помочь мне с ответом, я был бы благодарен. Давайте продолжить обсуждение в чате.

Joel Deleep 28.05.2019 10:02
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
8
4 459
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

После диркгротен мне удалось решить проблему, ответ позволил отобразить список сотрудников в разделе 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 или как вы назвали индексную страницу?

Mahhdy 07.03.2020 01:32

path('dashboard/attendance',views.attendance,name='attendanc‌​e'), ответ основан на прошлогодней версии django, но основной рабочий процесс известен из ответа

Joel Deleep 10.03.2020 07:25

Другие вопросы по теме