[英]How saving data rows using loop form to save data in django?
我正在尝试使用 django 3.0.3 throw loop 表单从输入表单中保存数据,问题是当我将数据输入表单时,只有第二行在数据库中保存和重复。
这是我的代码:
模型.py
from django.db import models
from datetime import datetime
class NumberOfStudent(models.Model):
class_num = models.CharField(max_length=100)
num_of_student = models.IntegerField()
student_abscence = models.IntegerField(default=0)
date = models.DateTimeField(blank=True, default=datetime.now)
def __str__(self):
return self.class_num
视图.py
from django.shortcuts import render, redirect
from .models import NumberOfStudent
from .forms import Insertdata
def home(request):
# Number of class's room for Grade 11
num_class_11 = 2
# Check if method of from is post
if request.method == 'POST':
insertdata = Insertdata(request.POST)
# Chck if data inserted is valid
if insertdata.is_valid():
for instance in range(num_class_11):
instance = insertdata.save(commit=False)
instance.pk = None
instance.save()
return redirect(data)
else:
insertdata = Insertdata()
context = {
'title': 'Home Page',
'num_class_11': num_class_11,
'range': range(num_class_11),
'insertdata': insertdata,
}
return render(request, 'hello/home.html', context)
def data(request):
class_11 = NumberOfStudent.objects.all()
context = {
'class_11': class_11,
}
return render(request, 'hello/data.html', context)
表格.py
from django import forms
from .models import NumberOfStudent
class Insertdata(forms.ModelForm):
class Meta:
model = NumberOfStudent
fields = ('class_num', 'num_of_student', 'student_abscence')
索引.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<div>
<a href="{% url 'home' %}">Home</a> | <a href="{% url 'data' %}">Data</a>
</div>
<form method="POST">
{% csrf_token %}
<table>
{% for class in range %}
<tr>
<td>
<input type="text" name="class_num" id="class_num" value="11/{{forloop.counter}}" readonly>
</td>
<td>
<input type="text" name="num_of_student" id="num_of_student">
</td>
<td>
<input type="text" name="student_abscence" id="student_abscence">
</td>
</tr>
{% endfor %}
</table>
<input type="submit" value="submit">
</form>
</body>
</html>
数据.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Data</title>
</head>
<body>
<div>
<a href="{% url 'home' %}">Home</a> | <a href="{% url 'data' %}">Data</a>
</div>
<table border="1" width="500px">
<thead style="text-align: center; background-color: bisque;">
<tr>
<td>Class</td>
<td>Total number</td>
<td>Abscence</td>
<td>Date</td>
</tr>
</thead>
{% for data in class_11 %}
<tbody style="text-align: center;">
<tr>
<td>{{data.class_num}}</td>
<td>{{data.num_of_student}}</td>
<td>{{data.student_abscence}}</td>
<td>{{data.date}}</td>
</tr>
{% endfor %}
</tbody>
</table>
</body>
</html>
任何人都可以帮助我吗?
我相信您的问题是您的 html 表单使用保存表单字段来发送两行,并以这种方式用另一行覆盖。
这意味着,在 index.html 中,您没有{% for class in range %}
任何地方使用{% for class in range %}
定义的类变量,特别是不要定义将发送的表单字段。
(注意:可能还有其他问题,但这似乎是第一个要解决的问题。)
出现此问题是因为您创建了一个迭代循环并且它迭代了两次(例如)并且每次您输入来自用户的信息但是任何信息? 您创建了一个条目表单并以重复的方式为同一字段获取了一些信息。 这意味着,您已经使用您在第二个字段中获取的新值修改了第一个字段的值,然后迭代循环开始:“D
试试这个(我已经试过了,它是有效的)
def home(request):
num_class_11 = 2
if request.method == 'POST':
for instance in range(num_class_11):
# getting value of input for each round of loop
num_of_studentINPUT = request.POST.get('num_of_student-'+str(instance))
student_abscenceINPUT = request.POST.get('student_abscence-'+str(instance))
class_numINPUT = request.POST.get('class_num-'+str(instance))
createObj = NumberOfStudent.objects.create(
num_of_student = num_of_studentINPUT,
student_abscence = student_abscenceINPUT,
class_num = class_numINPUT,
)
createObj.save()
return redirect(data)
else:
insertdata = Insertdata()
context = {
'title': 'Home Page',
'num_class_11': num_class_11,
'range': range(num_class_11),
'insertdata': insertdata,
}
return render(request, 'App/home.html', context)
enter code here
{% for class in range %}
<tr>
<td>
<input type="text" name="class_num-{{class}}" id="class_num" value="11/{{class}}"
readonly>
</td>
<td>
<input type="text" name="num_of_student-{{class}}" id="num_of_student">
</td>
<td>
<input type="text" name="student_abscence-{{class}}" id="student_abscence">
</td>
</tr>
{% endfor %}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.