Как создать новую запись, используя форму django - PullRequest
0 голосов
/ 29 марта 2020

Я хочу создать новую запись, используя django форму, но я застрял на ней, и я получаю такую ​​ошибку

IntegrityError at /academy/add_academy/3/
null value in column "Student_name_id" violates not-null constraint
DETAIL:  Failing row contains (39, da10, 2020-03-06, A, 11, 11, null).

Вот мой файл view.py

def add_academy(request,pk):
    child = get_object_or_404(Child_detail, pk=pk)
    academic = Academic.objects.filter(Student_name=child)
    form=AcademicForm(request.POST)
    if form.is_valid():
        form.save()
        return redirect('index')
    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'} 
    )
        )

А вот мой файл шаблона

 <div class="card">
          <div class="card-header bg-primary text-white">
            <h4>
              <i class="fas fa-user-plus"></i> Enter {{child.Firstname}} {{child.Lastname}}  details 
          </h4>
          </div>
          <div class="card-body">
            <form action="" method="POST" autocomplete="on">
            {% csrf_token %}
            <div class="form-group">
              {{form}}
              <input type="submit" value="Save" class="btn btn-primary btn-block">
            </form>
            </div>

А вот мой файл 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)

Спасибо за помощь

Ответы [ 2 ]

0 голосов
/ 29 марта 2020

Изменить это:

form=AcademicForm(request.POST, instance=academic)
0 голосов
/ 29 марта 2020

Решение

Измените 4-ю строку в вашем представлении с:

academic = Academic.objects.filter(Student_name=child)
form=AcademicForm(request.POST)

на

academic = Academic.objects.get(Student_name=child)  # make sure there is only one Academic instance in your db with this Student_name
form = AcademicForm(request.POST, instance=academic)

Объяснение

Не передавая экземпляр , form.save() пытается создать новый экземпляр.

Поскольку форма не содержит поля Student_name, при попытке создать новый экземпляр без этого поля возвращается ошибка.

...