【问题标题】:IntegrityError at /quizmaker/ (1048, "Column 'id_id' cannot be null")/quizmaker/ 处的 IntegrityError(1048,“列 'id_id' 不能为空”)
【发布时间】:2021-04-07 18:32:03
【问题描述】:

我正在尝试制作测验应用程序,因为我是 django 新手,无法构建在数据库表中保存外键字段的逻辑。有人请帮助我。

模型.py 在 models.py 中,类 quiztitle 是测验的标题和创建该测验的用户的 id(外键,用户模型)。 课堂问题是问题以及 4 个选项和正确答案。 Quizid(外键,测验题模型)和id(外键,用户模型) 课堂答案是针对参加测验的用户提交的答案。

from django.db import models
from django.contrib.auth.models import User

class quiztitle(models.Model):

    Quiz_id = models.AutoField(primary_key=True)
    Quiz_title = models.CharField(max_length=600)
    id= models.ForeignKey(User, on_delete=models.CASCADE)

class question(models.Model):

    Qid = models.AutoField(primary_key=True)
    id = models.ForeignKey(User,on_delete=models.CASCADE)
    Quiz_id = models.ForeignKey(quiztitle,on_delete=models.CASCADE)
    Qques = models.TextField()
    Qoption1 = models.TextField()
    Qoption2 = models.TextField()
    Qoption3 = models.TextField()
    Qoption4 = models.TextField()
    QAnswer = models.TextField()


class answer(models.Model):

    Ansid = models.AutoField(primary_key=True)
    Qid = models.ForeignKey(question,on_delete=models.CASCADE)
    Quiz_id = models.ForeignKey(quiztitle, on_delete=models.CASCADE)
    id = models.ForeignKey(User, on_delete=models.CASCADE)
    Answer = models.TextField()

forms.py

from django.forms import ModelForm
from django.contrib.auth.forms import UserCreationForm
from django import forms
from django.contrib.auth.models import User



class CreateUserForm(UserCreationForm):
   class Meta:
        model = User
        fields = ['username','email','password1','password2']

views.py

from django.shortcuts import render,redirect,HttpResponseRedirect
from .models import question ,quiztitle
from django.contrib import messages
from django.contrib.auth import  authenticate,login,logout
from django.contrib.auth.decorators import login_required
from django.http import HttpResponse
from django.contrib.auth.models import User
from django.forms import inlineformset_factory
from django.contrib.auth.forms import UserCreationForm
from .forms import CreateUserForm
from django.contrib import messages
from django.contrib.auth import  authenticate,login,logout
from django.contrib.auth.decorators import login_required
from django.contrib.auth.models import Group
# Create your views here.

@login_required(login_url='home')
def handle_quiz(request):

    if request.method=="POST":
        # get post parameters
        id = request.POST.get('id')
        Quiz_title = request.POST.get('Quiz_title')
        Quiz_id = request.POST.get('Quiz_id')
        Qid = request.POST.get('Qid')
        Qques = request.POST.get('Qques')
        Qoption1 = request.POST.get('Qoption1')
        Qoption2 = request.POST.get('Qoption2')
        Qoption3 = request.POST.get('Qoption3')
        Qoption4 = request.POST.get('Qoption4')
        QAnswer = request.POST.get('QAnswer')

   

        #I guess here is the mistake in saving the data in the mysql database

        title = quiztitle(Quiz_title=Quiz_title,Quiz_id=Quiz_id,id=id)
        title.save()
        detail = question(Qid=Qid,Quiz_id=Quiz_id,id=id,Qques=Qques,Qoption1=Qoption1,Qoption2=Qoption2,Qoption3=Qoption3,Qoption4=Qoption4,QAnswer=QAnswer)
        detail.save()

        messages.success(request,"Your question has been added succesfully ")
        return HttpResponseRedirect('/quizmaker')


    return render(request,"createquiz.html")

def logoutUser(request):
    logout(request)
    return redirect('home')#redirect to login page

def home_page(request):
    return render(request,'Home.html')

def registerPage(request):
    if request.user.is_authenticated:
        return redirect('home')
    else:
        form = CreateUserForm()

        if request.method == 'POST':
            form = CreateUserForm(request.POST)
            if form.is_valid():
                user = form.save()
                username = form.cleaned_data.get('username')
            
                messages.success(request, 'account has been created successfully for username' + username)
                return redirect('login')

        context = {'form':form}
        return render(request,'register.html',context)

def handle_login(request):
    if request.user.is_authenticated:
        return redirect('home')
    else:
        if request.method == 'POST':
            username = request.POST.get('username')
            password = request.POST.get('password')

            user = authenticate(request, username=username, password=password)
            if user is not None:
                login(request, user)
                return redirect('quizmaker')
            else:
                messages.info(request, 'Incorrect Username or Password')
        context = {}
        return render(request, 'login.html', context)

@login_required(login_url='login')
def handle_response(request):
    data= question.objects.all()
    return render(request, "student.html", {"messages": data})

admin.py

from django.contrib import admin
from .models import *
# Register your models here.
class quizadmin(admin.ModelAdmin):
    list_display = ['Qid','Quiz_id','Qques','Qoption1','Qoption2','Qoption3','Qoption4','QAnswer']

admin.site.register(question,quizadmin)
admin.site.register(quiztitle)

【问题讨论】:

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


    【解决方案1】:

    你猜你的问题在于titledetail

    要为ForeignKey 设置值,您需要一个对象。您可以使用末尾带有_id 的字段。

    在幕后,Django 将 "_id" 附加到字段名称以 创建它的数据库列名,见Django ForeignKey

    一定是

    title = quiztitle.objects.create(
        Quiz_title=Quiz_title,
        Quiz_id=Quiz_id,
        User_id_id=id # here 
    ) 
    
    detail = question.objects.create(
        Quiz_id_id=Quiz_id, User_id_id=id # and here,
        Qid=Qid, Qques=Qques, Qoption1=Qoption1, 
        Qoption2=Qoption2, Qoption3=Qoption3,
        Qoption4=Qoption4, QAnswer=QAnswer
    )

    我建议你在这里使用Django ModelForm

    基于上述,我建议您也重命名您的 ForeignKey 字段:

    • id > 到 用户
    • Quiz_id > 到 quiztitle

    Model style(Django Docs):

    • InitialCaps 用于类名(或用于返回的工厂函数 类)。

    • 字段名称应全部为小写,使用下划线代替 骆驼案。

    【讨论】:

    • 感谢您的回复,我已将这些行添加到 views.py 但现在出现了新错误:TypeError at /quizmaker/quiztitle() got an unexpected keyword argument 'id_id' 。
    • 我想将所有外键字段存储在数据库表中。 views.py 中的逻辑不适用。请帮助我,我是 django 的新用户。
    • @aishwaryayadav,我编辑了我的答案。是 id 还是 User_id 外键用户。您的第二个错误请求没有使用测验标题,而是 detail.Quiz_id = title
    • 我的错,它只有 id。现在它运作良好。非常感谢你救了我这是我的小项目。
    猜你喜欢
    • 2020-04-08
    • 2016-09-06
    • 2018-10-13
    • 2022-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-13
    • 2020-06-12
    相关资源
    最近更新 更多