整数错误位于/quizmaker/(1048,“列'id\u id'不能为空”)

2024-10-02 12:29:24 发布

您现在位置:Python中文网/ 问答频道 /正文

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

models.py 在models.py中,quiztitle类表示测验的标题和创建该测验的用户的id(外键,用户模型)。 课堂提问包括四个选项和正确答案。Quizid(外键,quiztitle模型)和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})

管理员

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)

Tags: djangofromimportauthidgetreturnmodels
1条回答
网友
1楼 · 发布于 2024-10-02 12:29:24

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

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

Behind the scenes, Django appends "_id" to the field name to create its database column name, see 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>;到用户
  • 测验id>;toquiztitle

Model styleDjango Docs):

  • 对类名(或返回的工厂函数)使用InitialCaps 课程)

  • 字段名称应全部小写,使用下划线而不是 camelCase

相关问题 更多 >

    热门问题