【问题标题】:I can't add a record from the django form into a database我无法将 django 表单中的记录添加到数据库中
【发布时间】:2020-07-12 04:56:38
【问题描述】:

我在views.py文件中有这个函数,负责将记录添加到数据库中

def add_academy(request,pk):
    child = get_object_or_404(Child_detail, pk=pk)
    academic = Academic.objects.get(Student_name=child)
    form = AcademicForm(request.POST, instance=academic)
    if form.is_valid():
        form.save()
        return redirect('more',pk=pk) #it will redirect but can't create a new record
    else:
        form=AcademicForm()
    context = {
        'academic':academic,
        'child':child,
        'form':form,
    }

    return render(request,'functionality/more/academy/add.html',context)

这是我的 form.py 文件

class AcademicForm(forms.ModelForm):
    class Meta:
        model=Academic
        fields='Class','Date','Average_grade','Overall_position','Total_number_in_class'
        labels={
            'Average_grade':'Average Grade',
            'Overall_position':'Overall Position',
            'Total_number_in_class':'Total Number In Class'
        }

    Date = forms.DateField(
    widget=forms.TextInput(     
        attrs={'type': 'date'} 
    )
        )

这是我的 model.py 文件

class Academic(models.Model):
    Student_name = models.ForeignKey(Child_detail,on_delete = models.CASCADE)
    Class = models.CharField(max_length =  50)
    Date = models.DateField()
    Average_grade = models.CharField(max_length = 10)
    Overall_position = models.IntegerField()
    Total_number_in_class = models.IntegerField()

    def __str__(self):
        return str(self.Student_name)

这也是我的模板,将用于显示表单

 <div class="card-body">
            <form action="" method="POST" autocomplete="on">
            {% csrf_token %}
            <div class="form-group">
              {{form | crispy}}
              <input type="submit" value="Save" class="btn btn-primary btn-block">
            </form>
            </div>

【问题讨论】:

  • 您确定您的代码通过了if form.is_valid() 检查吗?

标签: django django-models django-forms django-views django-templates


【解决方案1】:

添加新记录

def add_academy(request,pk):
    child = get_object_or_404(Child_detail, pk=pk)
    academic = Academic.objects.get(Student_name=child)
    if request.method=='POST':
    form = AcademicForm(request.POST)
        if form.is_valid():
            form.save()
            return redirect('more',pk=pk) 
        else:
            context = {
             'academic': academic,
             'child': child,
             'form': form,
         }
            return render(request, 'functionality/more/academy/add.html',context)
    else:
        form=AcademicForm()
        context = {'academic':academic,'child':child,'form':form}

        return render(request,'functionality/more/academy/add.html',context)

【讨论】:

    【解决方案2】:

    如果您希望创建新记录,则不能将 instance 传递到表单中。

    child = get_object_or_404(Child_detail, pk=pk)
    form = AcademicForm(request.POST)
    if form.is_valid():
        form.instance.Student_name = child
        form.save()
    

    【讨论】:

    • 如果我没有传递一个实例,它会引发完整性错误
    • @RegnaldTerry 我已经更新了我的答案。我猜验证错误是指出Student_name 不能为空。如果在检查表单提交是否有效后设置,它应该根据需要创建一个新实例。
    猜你喜欢
    • 2019-10-23
    • 2014-05-02
    • 2014-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多