【问题标题】:pre-populating partial Initial data in a Django formset在 Django 表单集中预填充部分初始数据
【发布时间】:2017-05-15 23:32:13
【问题描述】:

我在我的 django 表单集中实现初始数据时遇到了困难。

就上下文而言,我正在构建一个出勤应用程序,其中存在学生列表并且需要每天评估出勤率。

我想要做的是让管理员点击上面列出日期的链接。然后他们将被带到数据网格,其中每一行代表系统中的学生人数以及 4 列(学生姓名、日期、出席/缺席下拉菜单、备注字段)。目标是让学生姓名字段预填充学生模型中的学生列表,日期字段预填充用户单击链接上的日期,出勤和备注字段是用户输入。

任何帮助将不胜感激

谢谢!

Student model

class Student(models.Model):
    first_name = models.CharField(max_length=255)
    last_name = models.CharField(max_length=255)
    GENDER_CHOICES = (
        ('male', 'male'),
        ('female', 'female'),
    )
    gender =  models.CharField(max_length=12, choices=GENDER_CHOICES, null=False, blank=False)
    date_of_birth = models.DateField(auto_now=False, auto_now_add=False)

    @property
    def full_name(self):
        return ''.join([self.first_name, '_', self.last_name])

    def __unicode__(self):
        return self.full_name

Attendance model

class Attendance(models.Model):
    student = models.ForeignKey('students.Student')
    attendance_date = models.DateField(auto_now=False, auto_now_add=False)
    STATUS_CHOICES = (
        ('present', ‘1’),
        ('absent', ‘0’),
    )
    status =  models.CharField(max_length=12, choices=STATUS_CHOICES, null=False, blank=False)
    notes = models.CharField(max_length=300, null=True, blank=True)

    class Meta: 
        unique_together = ("student", "attendance_date")

    def __unicode__(self):
        return self.student

Attendance form

class AttendanceForm(forms.ModelForm):
    class Meta:
        model = Attendance
        fields = ["student","attendance_date", "status", "notes"] 


View

def add_attendance(request):
    s = Student.objects.all().values()
    AttendanceFormSet = formset_factory(AttendanceForm, extra=0)
    formset = AttendanceFormSet(request.POST or None, initial=s)
    if formset.is_valid():
        try:
            instance = form.save(commit=False)
            instance.save()
            return HttpResponseRedirect('/') 
        except:
            return HttpResponseRedirect('/')
    context = {
        "formset": formset,
    }
    return render(request, "group_attendance.html", context)


Template

 <table id="formset" class="form">
 {{ formset.management_form }}

{% for form in formset.forms %}
  {% if forloop.first %}
  <thead><tr>
    {% for field in form.visible_fields %}
    <th>{{ field.label|capfirst }}</th>
    {% endfor %}
  </tr></thead>
  {% endif %}
  <tr>
  {% for field in form.visible_fields %}
    <td>
    {# Include the hidden fields in the form #}
    {% if forloop.first %}
      {% for hidden in form.hidden_fields %}
      {{ hidden }}
      {% endfor %}
    {% endif %}
      {{ field.errors.as_ul }}
      {{ field }}
    </td>
  {% endfor %}
  </tr>
{% endfor %}
</table>

【问题讨论】:

    标签: django django-forms formsets


    【解决方案1】:

    我不太确定,如果我按照预期的方式理解了您的问题。我认为您正在寻找一种生成动态表单的方法,这些表单预先填充了数据库中的数据。

    一篇非常有用的文章,可以在这里找到https://jacobian.org/writing/dynamic-form-generation/

    您没有固定数量的学生(-> 表单中的字段),因此您必须根据需要生成尽可能多的字段。因此,您必须遍历学生并为每个学生创建一个表单字段。

    您可以在上面的文章中找到它。下面是一个代码 sn-p 及其解释:

    class UserCreationForm(forms.Form):
        username = forms.CharField(max_length=30)
        password1 = forms.CharField(widget=forms.PasswordInput)
        password2 = forms.CharField(widget=forms.PasswordInput)
    
        def __init__(self, *args, **kwargs):
            extra = kwargs.pop('extra')
            super(UserCreationForm, self).__init__(*args, **kwargs)
    
            for i, question in enumerate(extra):
                self.fields['custom_%s' % i] = forms.CharField(label=question)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-01
      • 1970-01-01
      • 2012-08-14
      • 1970-01-01
      • 2022-01-24
      • 1970-01-01
      • 2022-12-31
      • 2012-07-20
      相关资源
      最近更新 更多