Saya ingin meminta bantuan Anda.

Saya punya dua model. Pertanyaan dan jawaban. Satu pertanyaan bisa memiliki banyak jawaban. Model saya terlihat seperti ini:

class Question(models.Model):
    question = models.CharField(max_length=300)
    answered = models.BooleanField(default=False)
    created = models.DateTimeField(auto_now_add=True)
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    votesscore = models.IntegerField(default='0')
    amountofvotes = models.IntegerField(default='0')

    def __str__(self):
        return self.question


class Answer(models.Model):
    question_id = models.ForeignKey(Question, on_delete=models.CASCADE, blank=False, null=True)
    answer = models.TextField(max_length=1000)
    created = models.DateTimeField(auto_now_add=True)
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    votesscore = models.IntegerField(default='0')
    amountofvotes = models.IntegerField(default='0')

    def __str__(self):
        return self.answer

Ini views.py saya:

def home(request):
    allquestionswithanswers = Answer.objects.prefetch_related('question_id')
    allquestionswithoutanswers = Question.objects.filter(answered = False)
    return render(request, 'main/home.html', {'allquestionswithanswers': allquestionswithanswers, 'allquestionswithoutanswers': allquestionswithoutanswers})

Dan inilah home.html saya:

<h1>Questions with answers:</h1>
<ul>
    {% for allquestionwithanswer in allquestionswithanswers %}
    <li>
        {{ allquestionwithanswer.question_id }} {{ allquestionwithanswer.user }}<br><br>
        <br><br>
        {{ allquestionwithanswer.answer }}
    </li>
    {% endfor %}

</ul>

<h1>Questions without answers:</h1>
<ul>
    {% for allquestionwithoutanswer in allquestionswithoutanswers %}
    <li>
        {{ allquestionwithoutanswer.question }} {{ allquestionwithoutanswer.user }}
        <br><br>
        {{ allquestionwithoutanswer.answer }}
    </li>
    {% endfor %}

</ul>

Dan beberapa hal berfungsi dan beberapa tidak dan saya tidak mengerti bagaimana cara memperbaikinya :(

Saya telah mengerjakan "Pertanyaan dengan jawaban:". Itu mendaftar pertanyaan saya, dan jawaban yang sesuai, tetapi jika pertanyaan memiliki banyak jawaban, itu mencetak pertanyaan berkali-kali, setiap kali dengan jawaban berikutnya. Saya ingin melihatnya seperti ini: -Pertanyaan 1 -Jawaban 1 -Jawaban 2 -Pertanyaan 1 -Jawab1

Saya tahu bahwa saya harus menggunakan loop bersarang tetapi saya bereksperimen dengannya dan saya tidak bisa membuatnya berfungsi.

Dan masalah kedua saya adalah. Dalam "Pertanyaan tanpa jawaban:" Saya ingin membuat daftar semua pertanyaan di mana boolean "terjawab" = Salah. Tetapi dimungkinkan untuk menyetelnya ke false tetapi memiliki beberapa jawaban dan jika itu terjadi, saya ingin membuat daftar jawaban itu juga. Tapi di sini saya punya masalah dengan model, karena model Pertanyaan tidak memiliki informasi tentang jawaban. Ia bekerja hanya dengan cara lain.

Saya akan sangat berterima kasih atas bantuan dan arahan apa pun.

Terima kasih dan Semangat!

-1
Peksio 19 April 2020, 22:39

1 menjawab

Jawaban Terbaik

Untuk memperbaiki masalah saat mencetak pertanyaan beberapa kali, Anda harus melihat apa yang sebenarnya dilakukan loop Anda:

{% for allquestionwithanswer in allquestionswithanswers %}
    <li>
        {{ allquestionwithanswer.question_id }} {{ allquestionwithanswer.user }}
        <br><br><br><br>
        {{ allquestionwithanswer.answer }}
    </li>
{% endfor %}

Di sini, Anda mengulang koleksi allquestionswithanswers - tetapi, ini bukan kumpulan pertanyaan, ini kumpulan jawaban! Jadi Anda menjalankan loop untuk setiap jawaban dalam koleksi dan Anda mencetak pertanyaan dan jawaban setiap kali loop berjalan (satu per jawaban dalam koleksi).

Anda perlu bekerja dari kumpulan questions - dan Anda salah bahwa hubungan hanya berfungsi satu arah. Pertanyaan Anda mengetahui jawaban yang terkait dengannya. Sebenarnya, ada konvensi Django untuk mengambil kumpulan jawaban untuk pertanyaan tertentu. Anda menambahkan _set ke nama model, dalam hal ini adalah answer_set. Untuk model Anda, Anda akan menggunakan kumpulan kueri question.answer_set.all untuk mendapatkan semua jawaban untuk pertanyaan tertentu.

Jadi coba ini:

Dalam pandangan Anda:

def home(request):
    allquestionswithanswers = Question.objects.filter(answered = True)
    allquestionswithoutanswers = Question.objects.filter(answered = False)

    return render(request, 'main/home.html', {'allquestionswithanswers': allquestionswithanswers, 'allquestionswithoutanswers': allquestionswithoutanswers})

Dan dalam templat tampilan:

<h1>Questions with answers:</h1>
<ul>
    {% for question in allquestionswithanswers %}
        <li>
            {{ question.id }} {{ question.user }}
            <br><br><br><br>
            {% for answer in question.answer_set.all %}
                {{ answer }}
            {% endfor %}
        </li>
    {% endfor %}
</ul>

<h1>Questions without answers:</h1>
<ul>
    {% for question in allquestionswithoutanswers %}
        <li>
            {{ question }} {{ question.user }}
            <br><br>
            {% for answer in question.answer_set.all %}
                {{ answer }}
            {% endfor %}
        </li>
    {% endfor %}
</ul>

Beri tahu saya cara kerjanya. Juga, jika Anda belum melakukannya, pelajari tutorial Django dari mulai sampai selesai. Ini memandu Anda dalam membuat aplikasi polling, yang struktur modelnya hampir sama persis dengan aplikasi Anda (pertanyaan/jawaban).

1
Jim 19 April 2020, 19:56