Как установить 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)
Вернуться на верх