繁体   English   中英

如何使用循环形式保存数据行以在 django 中保存数据?

[英]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

试试这个(我已经试过了,它是有效的)

视图.html

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

主页.html

{% 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM