У меня есть модель модели ответов и ответов в зависимости от того, является ли вопрос множественным выбором или текстовым вводом.рендеринг формы Django с исходными данными
В моих взглядах я пытаюсь отобразить форму с исходными данными. Исходные данные получат ответ пользователя, если он уже был дан ответ, и он работает нормально, но когда возникает вопрос, чей ответ не был задан пользователем, выбрано исключение RelatedObjectDoesNotExist, и он говорит:
«UserTextAnswer не имеет my_answer », который указан в шаблонах.
Мои модели:
Question_Types_Choices = (
('multiple_choice', ('multiple_choice')),
('text_input', ('text_input'))
)
class Question(models.Model):
text = models.TextField()
active = models.BooleanField(default=True)
question_type = models.CharField(max_length = 250, choices =Question_Types_Choices)
timestamp = models.DateTimeField(auto_now_add=True , auto_now=False)
def __unicode__(self):
return self.text[:10]
class FreeTextAnswer(models.Model):
answers = models.ForeignKey(Question)
text = models.TextField(blank=True, null=True)
active = models.BooleanField(default=True)
timestamp = models.DateTimeField(auto_now_add=True , auto_now=False)
def __unicode__(self):
return self.text[:10]
class UserTextAnswer(models.Model):
user = models.ForeignKey(settings.AUTH_USER_MODEL)
question = models.ForeignKey(Question)
my_answer = models.ForeignKey(FreeTextAnswer)
my_points = models.IntegerField(default=-1)
timestamp = models.DateTimeField(auto_now_add=True, auto_now=False)
def __unicode__(self):
return self.my_answer.text[:10]
В моих взглядах:
def single(request,id):
if request.user.is_authenticated():
queryset = Question.objects.all().order_by('-timestamp')
instance = get_object_or_404(Question, id=id)
try:
user_text_answer = UserTextAnswer.objects.get(user=request.user, question=instance)
except UserTextAnswer.DoesNotExist:
user_text_answer = UserTextAnswer()
except UserTextAnswer.MultipleObjectsReturned:
user_text_answer = UserTextAnswer.objects.filter(user=request.user, question=instance)[0]
except:
user_text_answer = UserTextAnswer()
try:
free_text_answer = FreeTextAnswer.objects.get(answers_id=instance.id)
except FreeTextAnswer.DoesNotExist:
free_text_answer = FreeTextAnswer()
except FreeTextAnswer.MultipleObjectsReturned:
free_text_answer = FreeTextAnswer.objects.filter(answers_id=instance.id)[0]
except:
free_text_answer = FreeTextAnswer()
initial_dict = {
"my_answer": user_text_answer
}
form2 = UserTextFreeForm(request.POST or None, initial = initial_dict)
form = UserResponseForm(request.POST or None)
if request.method == 'POST':
if form2.is_valid():
"process the form"
В моих шаблонах я рендеринг это так,
<form method='POST' action='{% url "question_single" id=instance.id%}' > {% csrf_token %}
<h1>{{ instance.text }}</h1>
<input type='hidden' name='question_id' value='{{ instance.id }}' />
<h3>Your answer</h3>
{{ form2.my_answer.errors }}
{{ form2.my_answer }}
<input type='submit' value='Save and continue' />
</form>
Начальный словарь для вопроса, ответ на не должно быть пустым, но я пытался проверить длину, которую он всегда возвращает. Я также попытался поймать исключение user_text_answer.DoesNotExist, но не работает.
Как я могу контролировать свой начальный словарь, чтобы, когда у вопроса нет ответа, он нормально загружается без данных, и если у него есть ответ, связанный с ним, тогда он должен отображать данные?