Как отобразить поле вопроса на странице, где я использовал просмотр списка ответов в Django? - PullRequest
0 голосов
/ 31 марта 2020

Я создаю веб-сайт «Вопросы и ответы», например Quora, используя Django. Я создал ListView для вопросов на главной странице и, щелкнув по конкретному вопросу, я вижу вопрос и все ответы на этот вопрос, как Quora. Для этого я создал две модели ниже:

 class Questions(models.Model):
    questions_asked = models.CharField(default='' , max_length = 250)
    date_asked=models.DateTimeField(default=timezone.now)
    author = models.ForeignKey(Profile , on_delete = models.CASCADE)
    #Profile is also a model I created but not putting it here as it is not necessary. It 
    #has fields User,description,followers,image
    def get_absolute_url(self):
        return reverse('test Home')
    def __str__(self):
        if self.questions_asked[-1]!='?':
            return f'{self.questions_asked}?'
        else:
            return f'{self.questions_asked}' 


class Answers(models.Model):
    answer = models.CharField(default='No Answers yet' , max_length = 1000)
    date_answered = models.DateTimeField(default=timezone.now)
    question_answered = models.ForeignKey(Questions , on_delete = models.CASCADE)
    author = models.ForeignKey(Profile , on_delete = models.CASCADE)

    def get_absolute_url(self):
        return reverse('test quest detail' , kwargs={'pk':self.question_answered.pk})
    def __str__(self):
        return f'{self.answer}'

Когда щелкает вопрос, я передаю его первичный ключ следующему URL-адресу, на котором отображаются ответы. Когда в базе данных ответов есть ответы, я могу напечатать вопрос в теге на шаблоне HTML, как показано на рисунке. Это шаблон HTML, в котором я хочу показать выбранный вопрос и список ответов на этот вопрос:

<div class="container">
    <h2> {{answers.first.question_answered }} </h2>
    <div class="container">
        {% block answer %}
        {% endblock %}
    </div>
    {% for answer in answers %}
        <div class="container m-5 p-4">    
        <p>{{answer.answer}} </p> 
        <p>Answered on {{answer.date_answered}}</p>
        <p>By {{answer.author.user.username}} </p>
        </div>
    {% endfor %}

</div>

Но когда список ответов пуст, метод answers.first не может быть вызван, и вопрос не виден. Итак, как мне получить вопрос, по которому щелкнули, и отобразить его на странице, используя представления на основе классов.

Вот мой CreateView для добавления вопросов :

class QuestAddView(CreateView):
model = Questions
fields = ['questions_asked']
template_name = 'test1/add_question.html'
print('form is submitted')

def form_valid(self,form):
    profile = Profile.objects.filter(user=self.request.user).first()
    form.instance.author = profile
    return super().form_valid(form)
#I am also validating a form here to get the profile of the user who is the author of the 
#question.

ListView для ответов:

class AnswerListView(ListView):
template_name = 'test1/questdetail.html'
ordering = ['-date_answered']
context_object_name = 'answers'

def get_queryset(self):
    question = get_object_or_404(Questions,pk = self.kwargs['pk'])
    return Answers.objects.filter(question_answered = question)

ListView для вопросов:

class QuestListView(ListView):
model = Questions
template_name = 'test1/test.html'
context_object_name = 'questions'
ordering = ['date_asked']

1 Ответ

0 голосов
/ 31 марта 2020

Измените AnswerListView, как показано ниже:

class AnswerListView(ListView):
    ...

    def get_queryset(self):
        return Answers.objects.filter(question_answered=self.kwargs['pk'])

    def get_context_data(self, *args, **kwargs):
        context = super(AnswerListView, self).get_context_data(*args, **kwargs)
        context['question'] = get_object_or_404(Questions, pk=self.kwargs['pk'])
        return context

После этого изменения переменная question будет доступна в вашем шаблоне независимо от наличия какого-либо ответа.

...