【问题标题】:Passing initial value in formset在表单集中传递初始值
【发布时间】:2019-06-05 14:32:12
【问题描述】:

型号

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(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)

     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',))

模板

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

错误

当我使用 print(formset.errors) 时,控制台中打印了下面显示的方括号

[]

如何将员工作为考勤模型的初始值传递,如下图所示,员工将被渲染,渲染值必须作为员工在考勤模型中传递。

modelformset 或 inlineformset 有什么解决方法吗?对于问题中包含的观点,我无法正确理解。

【问题讨论】:

  • 向我们展示出勤表单集定义
  • 我已经编辑了代码,请看
  • 我8天前已经告诉过你使用inlineformset_factory而不是modelformset_factory以及如何传递initial。然后你说有错误但是当你说有错误时,您应该始终说出错误是什么并粘贴完整的堆栈跟踪。如果你这样做,我可以提供进一步的帮助。 “有一个错误”并没有告诉我们出了什么问题。
  • 因此,请使用您尝试使用inlineformset_factory 的代码更新您的问题并向我们展示错误。现在你只是在重复你之前的问题。
  • 我的错误,它在context['formset'] = AttendanceFormset(queryset=Attendance.objects.none(), instance=initial_hod, initial=[{'employee': employee} for employee inself.get_initial()['employee']]) 显示initial_hod not defined 'Name error' 我已经更新了问题

标签: python django time-and-attendance


【解决方案1】:

我错过了 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=self.request.user.email), initial=[{'employee': employee} for employee in self.get_initial()['employee']])
        if formset.is_valid():
            return self.form_valid(formset)


模板

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

【讨论】:

    猜你喜欢
    • 2012-08-15
    • 1970-01-01
    • 2010-12-25
    • 2011-11-22
    • 1970-01-01
    • 2019-02-17
    • 2014-06-21
    • 1970-01-01
    • 2011-10-06
    相关资源
    最近更新 更多