2015-10-19 4 views
1

Привет У меня есть к следующему models.pyДжанго: Доступ к OneToOneField в шаблоне

class Question(models.Model): 
    user = models.ForeignKey(User) 
    article = models.ForeignKey(Article) 
    number = models.CharField("문제번호", max_length=10, null=True, blank=True) 
    q_type = models.CharField("문제유형", max_length=15) 
    question = models.TextField("문제내용") 
    answer = models.TextField("답안", null=True, blank=True) 
    reference = models.TextField("참고사항", null=True, blank=True) 

    def __str__(self): 
     return "%s번: %s" % (self.number, self.question) 

class Professor(models.Model): 
    question = models.OneToOneField(Question, null=True, blank=True, related_name="related_professor") 
    articles = models.ManyToManyField(Article, null=True, blank=True) 
    name = models.CharField("교수이름", max_length=20) 

    def __str__(self): 
     return "%s" % (self.name,) 

views.py:

def read_q_table(request, board_id, article_id): 
    article = get_object_or_404(Article, id=article_id) 

    context = { 
     "boards" : Board.objects.all(), 
     "board_id" : board_id, 
     "questions" : Question.objects.all().order_by("number"), 
     "article" : article, 
     "professor" : Professor.objects.all() 
    } 
    return render(request, "q_table.html", context) 

Шаблон:

{% if questions %} 
    {% for question in questions %} 
    <div class="list-group-item"> 
     <div class="row text-center"> 
      <div class="col-xs-2 col-md-2">{{ question.related_professor.name }}</div> 
     </div> 
    </div> 
    {% endfor %} 
{% else %} 

То, что я хочу получить доступ имя поля профессора в шаблоне. Я передал в контекст список объектов класса вопросов в шаблон, и я хотел бы использовать атрибут OneToOneField, чтобы получить доступ к имени профессора в шаблоне.

Согласно Accessing Django OneToOneField in templates?, {{вопрос. related_professor.name}} должен работать, но это не так. Может ли кто-нибудь помочь? Спасибо.

Или это может быть проблема с сохранением данных профессора в первую очередь. Следующий код принимает форму ввода и отправляет их для их сохранения.

Professor.objects.get(name=professor).question = question_instance 
Professor.objects.get(name=professor).save() 

Эти две линии в def submit_question могут поднять бровь, но я не уверен. Здесь я пытаюсь получить экземпляр связанного профессора и обновить его поле вопроса (OneToOneField, относящееся к классу Question).

def submit_question(request, board_id, article_id): 
    article = get_object_or_404(Article, id= article_id) 

    try: 
     professor = request.POST["professor"].strip() 
     q_type = request.POST["q_type"].strip() 
     question = request.POST["question"].strip() 
     number = request.POST["number"].strip() 
     reference = request.POST["reference"].strip() 
     if request.POST['q_type']== "주관식": 
      answer = request.POST['d_answer'].strip() 
     else: 
      answer = request.POST['m_answer'].strip() 
    except KeyError: 
     request.session["error"] = "올바른 요청이 아닙니다." 
     return redirect("read_article", board_id, article_id) 

    if professor and q_type and question: 
     question_instance = article.question_set.create(q_type = q_type, question = question, user_id = request.user.id) 
     Professor.objects.get(name=professor).question = question_instance 
     Professor.objects.get(name=professor).save() 

    if number: 
     question_instance.number = number 

    if answer: 
     question_instance.answer = answer 

    if reference: 
     question_instance.reference = reference 

     question_instance.save() 

    else: 
     request.session["error"] = "출제교수, 문제유형 및 문제는 필수 입력 항목입니다." 
     return redirect("read_article", board_id, article_id) 
    return redirect("read_q_table", board_id, article_id) 
+0

Вы пробовали 'question.professor'? 'OneToOneField' являются специальными .. – mccc

+0

@mccc Да. Но это не решает проблему. – Bossam

+1

Действительно, вы должны использовать ModelForm для обновления вопроса; который избавится от целой загрузки этого кода, сделает проверку правильнее и, возможно, исправит вашу проблему. –

ответ

2

Эти две линии являются сомнительными:

Professor.objects.get(name=professor).question = question_instance 
Professor.objects.get(name=professor).save() 

Вторая линия получит профессор из базы данных снова, и это не будет иметь свой экземпляр вопрос прилагается больше, когда вы сохраните его. Попробуйте это вместо:

prof = Professor.objects.get(name=professor) 
prof.question = question_instance 
prof.save() 
Смежные вопросы