【问题标题】:Use different SQL data depending on url in Django根据 Django 中的 url 使用不同的 SQL 数据
【发布时间】:2017-05-08 15:22:44
【问题描述】:

如果我的 url 是“someurl/report/1/”,其中“report”是一个应用程序,“1”对应于我的 SQL 数据库中某个模型的 id,我将如何替换具有特定模型数据的模板?

就我而言,我正在编写一个显示不同海滩冲浪报告的网站。我已将其设置为每个 SQL 模型 ID 对应于不同的海滩。那么如果我想在模板中使用海滩“3”的数据,我将如何在html模板中显示这些数据?

追溯

使用 surfsite.urls 中定义的 URLconf,Django 按以下顺序尝试了这些 URL 模式: ^管理员/ ^report/ ^$ [名称='索引'] ^report/ (?P[0-9]+)$ [name='get_report'] 当前的 URL,report/1/,与其中任何一个都不匹配。

#URLS.PY
from django.conf.urls import url
from django.conf.urls.static import static
from . import views

    urlpatterns = [
        # /index/
        url(r'^$', views.index, name='index'),

        # /report/
        url(r'(?P<beach_id>[0-9]+)$', views.get_report, name='get_report'),
    ]


#MY TEMPLATE
<!DOCTYPE html>
<html>
    {% load staticfiles %}
    <link rel="stylesheet" type="text/css" 
    href="{% static 'report/css/style.css' %}"/>

    <link href="https://fonts.googleapis.com/css?family=Biryani:300,400,800" 
    rel="stylesheet"/>

   <head>
      <title>REALSURF</title>
  </head>

   <body>

      <h1>
        <form id="search">
          <input id="search" type="text">
        </form>
      </h1>

    <div class="container">
      <div class="column">
        <div class="text">Wind</div>
        <div class="number">{{Break.wind}}</div>
      </div>            
      <div class="column">
        <div class="text">Wave Height</div>
        <div class="number">{{Break.low}}-{{Break.high}}</div>
      </div>    
      <div class="column">
        <div class="text">Tide</div>
        <div class="number">{{Break.tide}}</div>
      </div>    
    </div>

    <h2>
      REALSURF
    </h2>

    <h3>
      A simple site by David Owens
    </h3>

   </body>
</html>




#MY MODEL
from __future__ import unicode_literals   
from django.db import models

class Beach(models.Model):
    name = models.CharField(max_length=50)
    high = models.SmallIntegerField()
    low = models.SmallIntegerField()
    wind = models.SmallIntegerField()
    tide = models.DecimalField(max_digits=3, decimal_places=2)

    def __str__(self):
        return self.name


#MY VIEWS
from django.http import Http404
from django.shortcuts import render
from .models import Beach

def index(request):
    allBeaches = Beach.objects.all()
    context = {
        'allBeaches': allBeaches,
    }
    return render(request, 'report/index.html', context) 

def get_report(request, id):
    try:
        beach = Beach.objects.get(id=id)

    except Beach.DoesNotExist:
        raise Htpp404("404")

    return render(request, 'report/index.html', {'beach': beach}) 

【问题讨论】:

    标签: python html django web


    【解决方案1】:

    如果我理解正确,您想创建视图,分别渲染海滩 你可以做这样的事情,你的看法:

    def get_beach(request, id)
      beach = Beach.objects.get(id=id)
      return render(request, 'path/to/your/template', {'beach':beach})
    

    网址:

    url(r'^someurl/report/(?P<id>[0-9]+)$', views.get_beach(), name='get_beach'),
    

    此页面的模板网址:

    <a href= "someurl/report/{{beach.id}}">beach</a>
    

    已编辑 这是你的观点,据我了解,这是详细视图,但选择所有对象(Break.objects.all())

    def detail(request, break_id):
        try:
            allBreaks = Break.objects.all()
    
        except Break.DoesNotExist:
            raise Http404("404")
    
        return render(request, 'report/index.html', {'allBreaks': allBreaks})
    

    所以你必须对此进行更改:

     def detail(request, break_id):
          try:
            break_detail = Break.objects.get(id=break_id)
            return render(request, 'path/to/your/template', {'break_detail':break_detail})
          except Break.DoesNotExist:
            raise Http404("404")
    

    那么你的网址应该是这样的:

    url(r'^someurl/report/(?P<break_id>[0-9]+)$', views.detail(), name='detail'),
    

    或者你可以使用get_object_or_404:

    def 详细信息(请求,break_id): break_detail = get_object_or_404(中断,id=break_id) return render(request, 'path/to/your/template', {'break_detail':break_detail})

    网址相同。

    所以如果你想访问风场,你只需写这个模板标签 {{break_detail.wind}}

    UPD2

    从这里换个地方

    ^admin/
    ^report/ ^$ [name='index']
    ^report/ (?P<beach_id>[0-9]+)$ [name='get_report']
    

    到这里:

    ^admin/
    ^report/(?P<beach_id>[0-9]+)$ [name='get_report']
    ^report/^$ [name='index']
    

    并删除report/之后的url中的空格

    【讨论】:

    • 行 beach = Beach.objects.get(id=id) 是什么过滤器从正确的 URL 中获取确切的海滩?
    • 那么我如何访问风变量,例如,在模板中?
    • 很难回答您的问题,因为您没有发布模型和视图。但是如果模型Beach 有字段wind,你可以访问它{{beach.wind}}。如果您想要更具体的答案,您必须发布更多信息。
    • 如果向下滚动,模型和视图位于代码部分的底部。当我尝试运行服务器时,我在您提供的 url 行上遇到语法错误?
    • 现在在测试网站时,“someurl/report/”可以正常工作,但任何像“someurl/report/1/”这样的网址都会失败。
    猜你喜欢
    • 1970-01-01
    • 2017-10-03
    • 1970-01-01
    • 2020-12-04
    • 2020-05-28
    • 1970-01-01
    • 2023-03-17
    • 2016-10-21
    • 2019-07-18
    相关资源
    最近更新 更多