【问题标题】:Django dynamic page generatingDjango动态页面生成
【发布时间】:2019-12-13 00:03:35
【问题描述】:

我正在学习 Django,并为自己做一个项目。

项目简介:这是一个旅游应用,用户必须选择他们的目的地。目的地将由管理员/超级用户从管理面板添加。

现在我可以从管理面板动态添加内容。

我想要什么:当用户点击特定目的地时,这应该会打开目的地页面。因为内容来自数据库(这意味着如果我在数据库中有 1 行,它将显示 1 个目的地)。

现在我想知道如何根据可用的内容创建网页?

Image of the code snippet of the destination

在“destinations.html”中,我应该添加什么,以便在我添加新目的地时它会创建一个页面,以及它会为该页面创建一个动态 URL。

例如。我有 1 个目的地,当我单击它时,它将打开目的地的页面(我可以通过创建一个新的视图对象来做到这一点)。但假设我添加了一个新目的地,它将为该第二个目的地创建一个页面。

【问题讨论】:

  • 您不需要为数据库中的每个单独目标提供视图。你完成教程了吗?这是一个基本的东西,在那里得到了很好的解释。
  • 信不信由你:D 你需要创建一个 html 和一个视图来创建多个目的地:D
  • @Moha369 ,假设我有 2 个目的地。当我点击一个目的地时,我将如何决定它会转到所需的目的地?

标签: django django-models django-templates django-views


【解决方案1】:

很简单,使用url标签,

即这是您的 URLconf:

from django.contrib import admin
from django.urls import path
from . import views

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', views.IndexView, name = 'home'),
    path('<dest_name>', views.DestinationView, name = 'destination')
]

你的意见.py

from django.shortcuts import render
from .models import *

# Create your views here.

def IndexView(request):
    destinations = Destinations.objects.all()
    context = {'destinations': destinations}
    return render(request, 'index.html', context)
def DestinationView(request, dest_name):
    destination = get_object_or_404(Destinations, name = dest_name)
    context = {'destination': destination}
    return render(request, 'destination.html', context)

你的index.html:

<!doctype html>

<html lang="en">
<head>
  <meta charset="utf-8">

  <title>Home</title>

</head>

<body>
 {% for dest in destinations %}
   <a href = '{% url 'destination' dest.name %}'>{{dest.name}}</a>
   {% endfor %}
</body>
</html>

我在 url 标签中添加的dest.name 将替换dest_namedestination 是我在urls.py 中分配的名称

希望能解决你的问题

【讨论】:

  • 稍作修改我就能做到这一点。
【解决方案2】:

我的每个模型都有一个列表、创建/更新和删除视图。每个列表视图都有指向创建/更新和删除视图的链接。这些视图将由负责维护该数据的业务中的功能使用。我想生成一个索引页面,提供指向我的一些但不是全部模型的链接。以下是我的做法。

在views.py中,我创建了一个基于函数的视图。

def index(request):
    # this is a function based view as opposed to a class based view
    app     = request.resolver_match.app_name
    exclude = ['Process','Instance']
    models  = apps.get_app_config(app).get_models()
    names   = [name for name in [model._meta.model.__name__ for model in models] if name not in exclude]
    context = {
        "names" : names,
    }
    return render(request, app + '/index.html', context)

在我的模板目录中,我创建了一个模板 app/templaes/app/index.html 以将模型名称呈现为 url。

{% for name in names %}
<li><a href="{% url request.resolver_match.app_name|add:':'|add:name|lower|add:'-review' %}">{{ name }}</a></li>
{% endfor %}

【讨论】:

    猜你喜欢
    • 2019-10-30
    • 2013-03-26
    • 2011-05-14
    • 1970-01-01
    • 2011-10-14
    • 1970-01-01
    • 1970-01-01
    • 2012-07-08
    • 2018-07-28
    相关资源
    最近更新 更多