如何从 django 模型表单中获取一个 id,将其用作 url,并从该表单的值中获取所有数据?

How do you take an id from a django model form, use it as the url, and get all the data from that value from the form?

我正在做 CS50 项目 2,需要制作一个网页,通过 url 接收 ID,并从数据库中检索有关该特定项目的所有信息以显示在网页上。

def listing(request, id):
    id = Listings.objects.get(id=2)
    return render(request, "auctions/listing.html",{
        "listings": Listings.objects.all()
    }) 

这是我当前的代码。我试图通过变量获取 url 参数中的 id,我希望 listings 变量只获取该项目的对象,但我不确定该怎么做。

如果您需要更多代码,请告诉我。非常感谢您的帮助!

urls.py

from django.urls import path
from .models import User, Listings
from .forms import ListingsForm
from . import views

urlpatterns = [
    path("", views.index, name="index"),
    path("login", views.login_view, name="login"),
    path("logout", views.logout_view, name="logout"),
    path("create", views.create, name="create"),
    path("watchlist", views.watchlist, name="watchlist"),
    path("categories", views.categories, name = "categories"),
    path("listings/<int:id>/", views.listing, name = "listing"),
    path("register", views.register, name="register")
]

listing.html

{% extends "auctions/layout.html" %}

{% block body %}

    {{% for listing in listings %}
    <img src ="{{ listing.image }}" style = "height: 10%; width: 10%;">
    <h4 class = "text">{{ listing.title }}</h4>
    <h6>Description: {{ listing.description }}</h6>
    <h6>Category: {{ listing.category }}</h6> 
    <h6>Price: ${{ listing.bid }}</h6>
{% endfor %}

{% endblock %}

我知道我必须更改 listing.html 一旦我弄清楚如何让 id 只显示该 id 的对象,但暂时这是我的 listing.html

我在这里做了很多假设,所以很抱歉,但我认为页面未找到错误和你原来的问题是相关的,我认为这一切都归结为两种不同的观点,两种不同的 url 路径,以及两个不同的模板。一个 view/path/template 用于 all listings(复数),另一个 view/path/template 用于单个 listing(单数)。

首先你需要 urls:

path("listings/", views.listings, name = "listings"),
path("listing/<int:id>/", views.listing, name = "listing"),

您已经拥有的东西似乎属于列表s view/path/template,并进行了一些修改。 listings 视图将没有 id,因为它将显示 all 个列表(请注意,我将所有这些更改为 listings 而不是列表,所以我不会将此与处理特定列表项的单个列表的视图混淆:

def listings(request):
    return render(request, "auctions/listings.html",{
       "listings": Listings.objects.all()
    })

此视图可以与您的列表s 模板一起使用(请注意,我将名称从 listing.html 更改为列表s .html,因为 listing.html 会处理特定的列表,而 listings.html 会列出所有列表)。另请注意 <a href="{% url 'listing' listing.id %}"> 部分,这是神奇的部分,其中 url 将使用特定列表的 id 创建(请注意,视图的 name 位于url 字,并且 ID 没有 有引号 - 它将是添加到生成的 url):

的参数
{% extends "auctions/layout.html" %}

{% block body %}

    {{% for listing in listings %}
    <img src ="{{ listing.image }}" style = "height: 10%; width: 10%;">
    <h4 class = "text">{{ listing.title }}</h4>
    <h6>Description: {{ listing.description }}</h6>
    <h6>Category: {{ listing.category }}</h6> 
    <h6>Price: ${{ listing.bid }}</h6>
    <a href="{% url 'listing' listing.id %}">link to this particular listing's page</a>
    {% endfor %}

{% endblock %}

现在转到特定列表的详细信息页面,上面生成的 link 会将用户带到该页面。

def listing(request, id):
    listing = Listings.objects.get(id=id)
    return render(request, "auctions/listing.html",{
        "listing": listing
    }) 

接下来您必须创建一个名为 listing.html 的模板,您可以在其中显示特定列表的所有详细信息。

CS50 Web Programming 课程很棒,也很难。对我帮助很大的是阅读 notes, and also stopping the video 并编写他演示的代码。所有的答案都在那里。只是一个建议;每个人的学习方式都不一样。祝你好运!