2016-12-21 2 views
0

У меня есть модель модели ответов и ответов в зависимости от того, является ли вопрос множественным выбором или текстовым вводом.рендеринг формы 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, но не работает.

Как я могу контролировать свой начальный словарь, чтобы, когда у вопроса нет ответа, он нормально загружается без данных, и если у него есть ответ, связанный с ним, тогда он должен отображать данные?

ответ

0

Вместо get с проверкой DoesNotExist и MultipleObjectsReturned вы могли бы просто использовать filter с first:

user_text_answer = UserTextAnswer.objects.filter(user=request.user, question=instance).first() 

initial_dict = {} 
if user_text_answer: 
    initial_dict["my_answer"] = user_text_answer 
0

Я понял это, почему первоначальный словарь возвращается значение одного, даже если он должен был быть пустым. Я решил его, выполнив следующие действия:

try: 
      user_text_answer = UserTextAnswer.objects.get(user=request.user, question=instance) 
      initial_dict = { 
      "my_answer": user_text_answer 
      } 
     except UserTextAnswer.DoesNotExist: 
      user_text_answer = UserTextAnswer() 
      initial_dict = { 

      } 
     except UserTextAnswer.MultipleObjectsReturned: 
      user_text_answer = UserTextAnswer.objects.filter(user=request.user, question=instance)[0] 
      initial_dict = { 
      "my_answer": user_text_answer 
      } 
     except: 
      user_text_answer = UserTextAnswer() 
      initial_dict = { 

      } 

Следует инициализируется в соответствии с ситуацией внутри попытки и, кроме блока, а не после этого.

Смежные вопросы