Django - Добавить объект, связанный с другим

Я попробовал настроить учебник по опросам Django.

Я дал опции, чтобы пользователи могли сами добавлять вопросы и опции.

Объект "Choice" из моего models.py кажется хитрым.

from django.db import models

# Create your models here.
class Question(models.Model):
    question = models.CharField(max_length=200)

    def __str__(self):
        return self.question

class Choice(models.Model):
    question = models.ForeignKey(Question, on_delete=models.CASCADE, related_name='choices')
    option = models.CharField(max_length=100)
    vote = models.IntegerField(default=0)

    def __str__(self):
        return self.option

Объект Choice имеет связь один-к-одному с вопросом. Когда я завершаю значения через приведенную ниже HTML-страницу, она не создает новый Choice.

{% extends 'base.html' %}
{% block content %}
<h1>Add Member</h1>

<form action = 'addoptrecord/' method='post'>

    {% csrf_token %}

    Choice: <br>
    <input name='ch'>
    <br>
    Vote: <br>
    <input name='vo'>
    <br>

    <label for="optquestions">Choose a Question:</label><br>
    <select name="optquestions" id="optquestions">
    {% for question in questions %}
    <option value={{question.id}}>{{question}}</option>
    {%endfor%}
    </select><br><br>
    <input type='submit' value='Submit'>

</form>
{% endblock %}


Не уверен в правильном синтаксисе/методе для связывания данных Choice с вопросом при добавлении через views.py

def addoptrecord(request,optquestions):
    ch = request.POST.get('ch')
    vo = request.POST.get('vo')
    que = Question.objects.get(id=optquestions)

    pollopt = Choice(que,option=ch,vote=vo)
    pollopt.save()
    return HttpResponseRedirect(reverse('index'))

Вышеуказанная операция вызывает ошибку целостности.

IntegrityError at /addopt/addoptrecord/
NOT NULL constraint failed: pollsapp_question.question

Во-первых, вы должны указать поле question в конструкторе Choice. А id вашего вопроса отправляется через POST данные, поэтому вы должны получить его тем же способом, что и предыдущие поля:

def addoptrecord(request,optquestions):
    ch = request.POST.get('ch')
    vo = request.POST.get('vo')
    optquestions = request.POST.get('optquestions')
    que = Question.objects.get(id=optquestions)

    pollopt = Choice(
        question=que,
        option=ch,
        vote=vo
    )
    pollopt.save()
    return HttpResponseRedirect(reverse('index'))
Вернуться на верх