Я создаю веб-сайт «Вопросы и ответы», например 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']