Представление mysite.views.Attendancecreate не возвращало объект HttpResponse.Вместо этого он вернулся - PullRequest
0 голосов
/ 08 июня 2019

Я пытаюсь создать систему посещаемости для списка сотрудников,

Модель

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(), instance=Head_of_department.objects.get(email=email), initial=[{'employee': employee} for employee inself.get_initial()['employee']])
        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.POSTqueryset=Attendance.objects.none(), instance=Head_of_department.objects.get(email=email), initial=[{'employee': employee} for employee inself.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/')
     def form_invalid(self, formset):
        print ('errors')
        print (formset.errors)

Формы

class Attendanceform(ModelForm):
    class Meta:
        model = Attendance
        fields = ('employee','attendance','hod')

AttendanceFormset = inlineformset_factory(Head_of_department,Attendance,fields=('attendance',))

Template

{% csrf_token %}
{{ formset.management_form }}
{% for form in formset %}
{{ form }}
<br><br>
{% endfor %}

Error

Ниже показанные квадратные скобки были напечатаны в консоли, когда я использовал print (formset.errors)

[]

Я получаю ошибку значения

The view mysite.views.Attendancecreate didn't return an HttpResponse object. It returned None instead.

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

enter image description here

Ответы [ 2 ]

1 голос
/ 14 июня 2019

форма набора недействительна и отсутствует request.POST

class Attendancecreate(CreateView):
    ...
    def post(self, request, *args, **kwargs):
        formset = AttendanceFormset(
            request.POST,
            queryset=Attendance.objects.none(), 
            instance=Head_of_department.objects.get(email=email), 
            initial=[{'employee': employee} for employee inself.get_initial()['employee'])
        )
        if formset.is_valid():
            return self.form_valid(formset)
        return self.form_invalid(formset)

    def form_invalid(self, formset):
        print (formset.errors) # Will print the error in terminal

Шаблон

{{ formset.management_form }}
   {% for form in formset %}
      {{ form.employee.initial }} {{ form.employee}}  {{ form.attendance }}
<br><br>
   {% endfor %}
0 голосов
/ 08 июня 2019

Ожидается, что views in Django вернут HttpResponse как результат, но переопределенный метод post не вернет HttpResponse, если не задан набор форм действительный.

Вы можете оставить отзыв пользователю, если форма не действительна, как показано ниже.

class Attendancecreate(CreateView):
    ...
    def post(self, request, *args, **kwargs):
        formset = AttendanceFormset(
            request.data,
            queryset=Attendance.objects.none(), 
            instance=Head_of_department.objects.get(email=email), 
            initial=[{'employee': employee} for employee inself.get_initial()['employee'])
        )
        if formset.is_valid():
            return self.form_valid(formset)
        return self.form_invalid(formset)

    def form_invalid(self, formset):
        response_kwargs = {'content_type': self.content_type}
        context = {'errors': formset.errors}
        return self.response_class(
            request=self.request,
            template=self.get_template_names(),
            context=context,
            using=self.template_engine,
            **response_kwargs
        )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...