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'))