2017-01-01 9 views
0

Django formset에서 초기 데이터를 구현하는 데 어려움이 있습니다.Django formset의 부분 데이터를 미리 채우기

문맥 상, 나는 학생 목록이 존재하며 매일 출석을 평가해야하는 출석 앱을 만들고 있습니다.

내가 뭘하려고하는 것은 관리자가 날짜가 나열된 링크를 클릭하도록하는 것입니다. 그런 다음 데이터 그리드로 이동하여 각 행은 4 열 (학생 이름, 날짜, 현재/부재 드롭 다운, 메모 필드)과 함께 시스템의 학생 수를 나타냅니다. 목표는 학생 이름 필드에 Student 모델의 학생 목록이 미리 채워지도록하고, 날짜 필드는 사용자가 클릭 한 링크의 날짜와 출석 및 메모 필드를 사용자 입력으로 미리 채 웁니다.

어떤 도움이 많이

감사 감사하겠습니다!

- 나는 당신의 질문 의도 된 방법을 이해하면

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> 

답변

0

나는, 정말 모르겠어요. db의 데이터로 미리 채워진 동적 양식을 생성하는 방법을 찾고 있다고 생각합니다. 그것에 대해

정말 도움이 문서는 여기 https://jacobian.org/writing/dynamic-form-generation/

찾을 수 있습니다 당신은 학생들의 고정 번호가 없습니다 - 당신이 필요한만큼 필드를 생성 할 수 있도록, (양식> 필드). 따라서 학생들을 반복하고 매 하나마다 양식 필드를 만들어야합니다.

위 기사에서이 내용을 확인할 수 있습니다. 아래에 코드 스 니펫과 그 설명이 나와 있습니다.

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)