Как установить foreign методом post в django?
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>
Я делаю проект elearning. Мне нужен выпадающий список с курсами и передать их идентификаторы в таблицу Exam.course id является внешним ключом. Я хочу передать courseid в колонку course в таблице Exam.By this code I gets error as,Cannot assign "'1'": "Exam.course" должен быть экземпляром "Courses".
Вы присваиваете первичный ключ 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()
, и вы можете напрямую присвоить id курса в модели Exam
, поэтому представление должно быть:
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)