繁体   English   中英

/quizmaker/ 处的 IntegrityError(1048,“列 'id_id' 不能为空”)

[英]IntegrityError at /quizmaker/ (1048, “Column 'id_id' cannot be null”)

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

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

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']

视图.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})

管理员.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)

正如您猜测的那样,您的问题在于titledetail

要为ForeignKey设置一个值,您需要一个 object。 您可以使用末尾带有_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 > 到测验标题

Model 样式Django 文档):

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

  • 字段名称应全部小写,使用下划线而不是驼峰式。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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