【问题标题】:Django template rendering not giving expected resultsDjango模板渲染没有给出预期的结果
【发布时间】:2020-10-17 21:03:55
【问题描述】:

我正在将视图中的数据渲染到我的模板中,如下所示:

<tbody>
    {% for item in lyrics %}
    <tr class='lyrics-table'>
      <td>{{item}}</td>
      <td>
      {% if item in user_flash %}
         <p>{{flash}}</p>
       {% else %}
        <p>xxx</p>
      {% endif %}
     </td>

{{item}} 按预期工作,但{{flash}} 只为每一行提供相同的值,而不是相关值。

我的看法如下:

class SongVocab(LoginRequiredMixin, generic.DetailView):
    model= models.Song
    template_name = 'videos/song_vocab.html'
    context_object_name = 'song'

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)

        from pymystem3 import Mystem
        m = Mystem()
        user_flash = Flashcard.objects.filter(owner=self.request.user).values_list('question', flat=True)
        lyrics_list = models.Song.objects.get().lyrics_as_list()
        user_flash_ = [item.replace('\n', ' ') for item in m.lemmatize(" ".join(user_flash))]
        user_flash_clean = [w for w in user_flash_ if w.strip()]  ##removes empty strings
        lyrics_list_ = [item.replace('\n', ' ') for item in m.lemmatize(" ".join(lyrics_list))]
        lyrics_list_clean = [w for w in lyrics_list_ if len(w.strip())]
        user_word = list(set(user_flash_clean) & set(lyrics_list_clean))

        import icu # PyICU
        def sorted_strings(strings, locale=None):
            if locale is None:
                return sorted(strings)
            collator = icu.Collator.createInstance(icu.Locale(locale))
            return sorted(strings, key=collator.getSortKey)
        context['percent_known'] = ((len(user_word))/(len(set(lyrics_list_clean))))*100
        context['lyrics'] = sorted_strings(set(lyrics_list_clean),"ru_RU.UTF8")
        context['user_flash'] = user_flash_clean

        for word in user_word:
            flash = Flashcard.objects.get(owner=self.request.user, question=word)

        context['flash'] = flash.answer

        return context

我认为使用for 循环可以让我得到flash.answer 用于user_word 中的所有单词。在我正在测试的示例中,应该有两个词,但我只得到一个。我做错了什么?

模型.py:

class Flashcard(models.Model):
    owner = models.ForeignKey(User, on_delete=models.CASCADE)
    deck = models.ForeignKey(Deck, on_delete=models.CASCADE)
    question = models.TextField()
    answer = models.TextField()
    created_at = models.DateTimeField(auto_now_add=True)
    last_shown_at = models.DateTimeField(auto_now_add=True)
    next_due_date = models.DateTimeField(default=timezone.now)
    difficulty = models.FloatField(default=2.5)
    consec_correct_answers = models.IntegerField(default=0)

    objects = FlashcardManager()

    def __str__(self):
        return self.question

    def number_of_questions(self):
        return self.question.count(deck=deck.id)

【问题讨论】:

    标签: python python-3.x django django-views django-templates


    【解决方案1】:

    在您的代码中

    for word in user_word:
        flash = Flashcard.objects.get(owner=self.request.user, question=word)
    context['flash'] = flash.answer
    

    context['flash'] 将保留最后一个 flash.answer,因为最后一行在 for 循环之外(它比第二行少一个缩进级别)。


    你的意思可能是这样的吗?

    context['flash_list'] = []
    for word in user_word:
        flash = Flashcard.objects.get(owner=self.request.user, question=word)
        context['flash_list'].append(flash.answer)
    

    【讨论】:

    • 谢谢。现在这给了我整个查询集,但是我现在如何才能在我的模板中显示相关值(而不是整个查询集)?
    • @MeL 我不确定我是否理解这个后续问题。您能否将您的模型添加到问题中以便更好地了解情况?
    • 我已经添加了我的抽认卡模型。但是,如果您在这里查看我的后续问题,我希望能更好地解释一下,也许会更好:stackoverflow.com/q/62620352/13290801
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-29
    • 1970-01-01
    • 2019-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多