如何在djang数据库过滤模板中呈现链接

2024-06-17 09:21:56 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用数据库中的“keyone”列来过滤条目。到目前为止,在我编写的代码中,我成功地用“keyone=2”值呈现模板。我应该在一个新的模板文件中写什么,我应该如何修改现有的模板文件视图.py因此,当模板文件呈现时,它包含一个链接列表,每个链接对应“keyone”的每个值,当我点击链接说“keyone=2”时,所选条目应该呈现在主页.html你知道吗

你知道吗型号.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)])

你知道吗视图.py你知道吗

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

你知道吗主页.html你知道吗

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

示例数据库 sample database

所需渲染 desired rendering


Tags: 文件textpyself模板数据库return链接
3条回答

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

所以代码是这样的:

你知道吗型号.py你知道吗

# app.models.py would remain the same

你知道吗视图.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中某列的distinct值

你知道吗主页.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>

当我们在nav链接中传递url的键时,我们需要更改url模式来捕捉这个。你知道吗

你知道吗网址.py你知道吗

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

感谢@sheng zhang提供解决方案。为了我的利益,这里是经过一些轻微修改的工作代码。你知道吗

我创建了一个新模板选择.html逻辑是这样的-

你知道吗视图.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,
    })

你知道吗索引.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>

你知道吗主页.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>

你知道吗网址.py你知道吗

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

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

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

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

相关问题 更多 >