2017-01-01 13 views
0

У меня возникли трудности с внедрением исходных данных в моем наборе форм django.Предварительно заполненные частичные Начальные данные в наборе форм Django

Для контекста я создаю приложение для посещаемости, в котором существует список студентов, и каждый день нужно оценивать его посещаемость.

То, что я пытаюсь сделать, - это щелкнуть администратором ссылку, на которой указана дата. Затем они будут перенесены в сетку данных, где каждая строка представляет количество студентов в системе вместе с 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) 

 Смежные вопросы

  • Нет связанных вопросов^_^