2017-01-01 20 views
0

djangoフォームセットで初期データを実装するのが難しいです。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> 

答えて

0

私が意図した方法であなたの質問を理解している場合、私は、本当にわかりません。ダイナミックフォームを生成する方法を探していると思いますが、dbのデータがあらかじめ格納されています。 ( - フォームで>フィールド)ので、あなたが必要な数のフィールドを生成する必要が

Aそのことについて本当に便利の記事は、ここに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) 
関連する問題