【问题标题】:How to render links in a template for database filtering in django如何在模板中呈现链接以在 django 中进行数据库过滤
【发布时间】:2019-11-24 11:09:54
【问题描述】:

我正在使用数据库中的“keyone”列来过滤条目。到目前为止,在我编写的代码中,我成功地能够使用“keyone = 2”值渲染模板。我应该在新模板文件中写什么,以及我应该如何修改现有的views.py,以便在模板文件呈现时它包含一个链接列表,每个链接对应“keyone”的每个值,当我点击链接时说"keyone = 2",选择的条目应该在 home.html 中呈现

models.py

# app/models.py
from django.db import models
from django.urls import reverse # new

class Post(models.Model):
    text = models.TextField()
    def __str__(self):
        return self.text[:50]
    keyone = models.IntegerField(default = '777')

    def get_absolute_url(self): # new
        return reverse('post_detail', args=[str(self.id)])

views.py

def HomePageView(request):
    key2select = Post.objects.filter(keyone=2)
    return render(request, 'home.html', {
        'key2select': key2select,
    })

home.html

<ul>
  {% for post in key2select %}
  <li>{{ post.keyone }}&nbsp &nbsp{{ post.text }}</li>
  {% endfor %}
</ul>

示例数据库

所需的渲染

【问题讨论】:

标签: python django django-models django-queryset


【解决方案1】:

首先,我们需要获取数据库中的所有 keyone 值,以传递给 home.html。 然后在 home.html 中,我们需要一个导航栏或其他地方来放置所有这些代表所有 keyone 值的链接。

所以代码是这样的:

models.py

# app.models.py would remain the same

views.py

def homePageView(request, key):
    key2select = Post.objects.filter(keyone=key)
    keyones = Post.objects.distinct('keyone')
    return render(request, 'home.html', {
        'key2select': key2select,
        'keyones': keyones
    })

您可以检查Django Docs 中的 distinct() 以获取 DB 中列的不同值

home.html

<!-- home.html -->
<nav>
    <ul>
        {% for key in keyones %}
            <li><a href="{% url 'app:home' key%}">somthing {{key}} something</a></li>
        {% endfor %}
    </ul>
</nav>
...
<ul>
  {% for post in key2select %}
  <li>{{ post.keyone }}&nbsp &nbsp{{ post.text }}</li>
  {% endfor %}
</ul>

当我们将密钥传递给导航链接中的 url 时,我们需要更改 url 模式来捕获它。

urls.py

urlpatterns =[
    ...
    path('home/<int:key>/', views.homePageView, name='home')
    ...
]

【讨论】:

  • 谢谢,这正是我想要的。我将解决我遇到的一些错误,并让您知道它是否有效。
  • 只需更改一次keyones = Post.objects.values_list('keyone',flat=True).distinct(),我已经在下面发布了完整的代码,再次感谢。
  • 很高兴它有帮助。我知道 distinct() 方法会有一些问题,因为我不确定你使用哪个 SQL,无论如何,我很高兴你自己弄清楚,这是最好的。
【解决方案2】:

可能是我不明白你的问题,如果你正在寻找创建链接代码列表应该是

<ul>
   {% for post in key2select %}
       <a href="{% url "post_detail" post.id %}"><li>{{ post.keyone }}&nbsp &nbsp{{ post.text }}</li><a/>
   {% endfor %}
</ul>

这将包含每个带有列表项的帖子链接

【讨论】:

  • 是的,你没有完全理解这个问题,我的错是我没有给出示例数据库,我已经编辑了原始问题
【解决方案3】:

感谢@sheng-zhuang 提供解决方案。这是工作代码,为了我的利益而稍作修改。

我创建了一个新模板 select.html,这是逻辑 -

Views.py

class IndexView(TemplateView):
    template_name = 'index.html'

def SelectView(request):
    keyones = Post.objects.values_list('keyone',flat=True).distinct()
    return render(request, 'select.html', {
        'keyones': keyones
    })

def HomePageView(request, key):
    key2select = Post.objects.filter(keyone=key)
    return render(request, 'home.html', {
        'key2select': key2select,
    })

index.html

<header>
  <a href="{% url 'select' %}">Select</a><br />
  <a href="{% url 'post_new' %}">Post</a>
</header>

选择.html

<nav>
    <ul>
        {% for key in keyones %}
            <li><a href="{% url 'home' key%}">Keyone value = {{key}} </a></li>
        {% endfor %}
    </ul>
</nav>

home.html

<header>
  <a href="{% url 'select' %}">Select</a><br />
  <a href="{% url 'post_new' %}">Post</a>
</header>
<br /><br /><br /><br />

<ul>
  {% for post in key2select %}
  <li>{{ post.keyone }}&nbsp &nbsp{{ post.text }}</li>
  {% endfor %}
</ul>

urls.py

   path('', IndexView.as_view(), name='index'),
   path('select/', SelectView, name='select'),
   path('home/<int:key>/', HomePageView, name='home')

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-05-04
    • 2019-10-27
    • 2016-10-05
    • 2021-05-15
    • 1970-01-01
    • 2012-12-18
    • 2020-06-19
    • 2017-11-08
    相关资源
    最近更新 更多