如何在django中通过post方法设置foreign



models.py

class Courses(models.Model):
course_name=models.CharField(max_length=50)
course_price=models.IntegerField()
class Exam(models.Model):
exam_name=models.CharField(max_length=101)
course=models.ForeignKey(Courses,on_delete=models.CASCADE,default='python')
exam_time=models.DateTimeField()

views.py

def Examadd(request):
mycourses = Courses.objects.all()
context = {'mycourses': mycourses}
if request.method == 'POST':
newexam = request.POST.get('examname')
course = request.POST.get('courses')
examtime = request.POST.get('time')
new = Exam.objects.create(exam_name=newexam,course=course,exam_time=examtime)
new.save()
messages.success(request, "Course created successfully")
return redirect('Courselist')
return render(request,'addexam.html',context)

addexam.html

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<h1>Add New Exam</h1>
<form method="post">
{% csrf_token %}
<label>Examname:</label>
<input type="text" name="examname">
<label>Course:</label>
<select name="courses">
{% for i in mycourses %}
<option value={{i.id}}>{{i.course_name}}</option>
{% endfor %}
</select>
<label>Exam time and date:</label>
<input type="text" name="examtime">
<button type="submit">Add</button>
</form>
</body>
</html>

我正在做一个电子学习项目。我想要一个包含课程的下拉列表,并将其id传递到Exam表。课程id是外键。我想把课程ID传给考试表中的课程列。通过此代码,我得到的错误为,无法分配"1〃:"考试课程;必须是";课程";例子

您应该将主键分配给course_id,因此:

def Examadd(request):
mycourses = Courses.objects.all()
context = {'mycourses': mycourses}
if request.method == 'POST':
newexam = request.POST.get('examname')
course = request.POST.get('courses')
examtime = request.POST.get('time')
new = Exam.objects.create(
exam_name=newexam, course_id=course, exam_time=examtime
)
messages.success(request, "Course created successfully")
return redirect('Courselist')
return render(request, 'addexam.html', context)

然而,我建议使用ModelForm,这样可以更容易地保存数据,也不容易出错,但也可以进行适当的验证:例如,检查time是否确实通过了,以及它是否格式化为正确的日期时间字符串。


注意:通常Django模型被赋予单数名称,因此Course而不是Courses


注意:通常模型字段没有带有模型名称的前缀。这使得查询读取时间较长,并且经常希望使用(抽象)模型的继承继承字段,因此使用前缀会降低其可重用性。因此最好将字段course_name重命名为name

首先,create()方法不需要调用save()方法,并且可以直接在Exam模型中分配课程id,因此视图应该是:

def Examadd(request):
mycourses = Courses.objects.all()
context = {'mycourses': mycourses}
if request.method == 'POST':
newexam = request.POST.get('examname')
course = request.POST.get('courses')
examtime = request.POST.get('time')
new = Exam.objects.create(exam_name=newexam,course__id=course,exam_time=examtime)
messages.success(request, "Course created successfully")
return redirect('Courselist')
return render(request,'addexam.html',context)

最新更新