是否可以在Django中循环自定义模型表单?

时间:2019-06-25 05:53:03

标签: html django

是否可以通过在for循环中循环相同的表单来在Django中为模型创建多个对象。我正在使用自定义模型表格。

我的模板是:

{% for query in queryset %}
<form method="POST" action="{% url 'academics' %}" style=" padding: 5%">
    {% csrf_token %}                            
    <input type="text" name="Student" class="form-control" id="id_Student" 
    value="{{query}}">
    <input type="text" name="Subject" class="form-control" required id="id_Subject">
    <input type="checkbox" name="Presence" id="id_Presence">
    <button type="Submit" id="submit">Submit</button>
    {% endfor %}
    <button type="Submit" id="submit">Submit</button>
</form>

我的models.py是:

class Attendance(models.Model):
    Student = models.CharField(max_length=100, blank=False)
    Hour = models.CharField(max_length=1, blank=False)
    Subject = models.CharField(max_length=8, blank=False)
    Date = models.DateTimeField(default=timezone.now)
    Presence = models.BooleanField(default=False, blank=False)
    def __str__(self):
        return f'{self.Student}'

我的views.py是:

def academics(request):
    if request.user.is_staff:
        form = forms.AttendanceForm()
        context = {
                    'form': form,
                    'queryset': User.objects.filter(profile__Year='SY',profile__Department='CSE')

                }
        if request.method == "POST" :
            form = forms.AttendanceForm(request.POST)
            if form.is_valid():
                student = request.POST.get('Student')
                hour = request.POST.get('Hour')
                subject = request.POST.get('Subject')
                boolean = request.POST.get('Presence')
                def bool(boolean):
                    if boolean == 'on':
                        return 'True'
                    else:
                        return 'False'
                form = Attendance(Student=student,Hour=hour,Subject=subject,Presence=bool(boolean))
                form.save()                
        return render(request, 'console/academics.html',context)

当前,我可以创建多个对象,但是具有与上一个表单相同的值。即,使用最后一个形式的值创建对象。在这里,我循环了表格,以便为n个查询生成n个表格,并在第一个字段中自动填写名称。我知道解释这有点复杂。有人可以帮忙吗?

2 个答案:

答案 0 :(得分:0)

由于声誉,我无法发表评论,但是我相信这是您达到期望结果的方式。使用 WHILE LOOP 。 我自己对python和Django的了解不多,但是我想这是逻辑。如果我错了,请纠正我,而不是投反对票。

        var = 0
        n = 5
        if request.method == "POST":
            form = forms.AttendanceForm(request.POST)
            if form.is_valid():
                while var < n:
                student = request.POST.get('Student')
                hour = request.POST.get('Hour')
                subject = request.POST.get('Subject')
                boolean = request.POST.get('Presence')

                def bool(boolean):
                    if boolean == 'on':
                        return 'True'
                    else:
                        return 'False'
                form = Attendance(Student=student, Hour=hour,Subject=subject,Presence=bool(boolean))
                form.save()
                var += 1
        return render(request, 'console/academics.html', context)

答案 1 :(得分:0)

我不清楚“循环表单”是什么意思,但是如果您希望用户能够输入任意长度的相似数据集的列表,那么您想要的是{{3 }}或Formset。回来时,您可以验证他提交的所有数据,如果一切都很好,则可以遍历所有数据,通常创建或修改多个对象。