Django - 在我的PhoneReview应用程序中实现模型和视图的问题



我是Django的初学者。我正在构建一个名为PhoneReview的Django应用程序。它将存储与最新手机相关的评论。它还将显示手机品牌以及相关的手机型号。我已经为以下对象创建了模型:

  1. 品牌 – 品牌详细信息,例如名称、产地、制造时间等

  2. 型号 – 有关型号的详细信息,例如型号名称、发布日期、平台等

  3. 评论 – 在手机上评论文章和发布日期等

  4. 复习和模型之间的多对多关系。

现在,我必须为以下内容创建视图:

一个。一个索引页,显示可用于移动电话的所有品牌 数据库

二.选择品牌时显示型号的手机型号页面。

三.选择模型时包含评论和新闻链接的详细信息页面

我已经设法为"a.一个索引页,显示数据库中可用于移动电话的所有品牌。但是,我被"b.选择品牌时显示模型的手机型号页面。

我已经设法显示手机型号页面。但是,未显示电话型号的名称。所以,我觉得视图或模板都有问题。但是我在运行服务器时没有收到任何错误。所以,我有点困惑。

以下是PhoneReview应用程序的models.py代码。

from django.db import models
from django.template.defaultfilters import slugify
# Create your models here.
class Brand(models.Model):
brand_name = models.CharField(max_length=100)
origin = models.CharField(max_length=100)
manufacturing_since = models.CharField(max_length=100, null=True, blank=True)
def __str__(self):
return self.brand_name
class PhoneModel(models.Model):
brand = models.ForeignKey(Brand, on_delete=models.CASCADE)
model_name = models.CharField(max_length=100)
launch_date = models.CharField(max_length=100)
platform = models.CharField(max_length=100)
def __str__(self):
return self.model_name
class Review(models.Model):
phone_model = models.ManyToManyField(PhoneModel, related_name='reviews')
review_article = models.TextField()
date_published = models.DateField(auto_now=True)
slug = models.SlugField(max_length=150, null=True, blank=True)
def __str__(self):
return self.review_article  

以下是PhoneReview应用程序的urls.py代码:

from . import views
from django.urls import path
urlpatterns = [
path('index', views.BrandListView.as_view(), name='brandlist'),
path('phonemodel/<int:pk>/', views.ModelView.as_view(), name='modellist'),
]

以下是PhoneReview应用程序的views.py代码:

from django.views import generic
from .models import Brand, PhoneModel

class BrandListView(generic.ListView):
template_name = 'PhoneReview/brandlist.html'
context_object_name = 'all_brands'
def get_queryset(self):
return Brand.objects.all()

class ModelView(generic.DetailView):
model = PhoneModel
template_name = 'PhoneReview/phonemodel.html'

这是基本.html文件的代码。顾名思义,这是基本页面。它将被扩展为供其他页面使用,如品牌列表.html用于显示手机品牌列表和手机型号.html用于显示手机型号。它位于GameReview文件夹>模板内:

<!DOCTYPE html>
<html lang="en">
<head>
<title>{% block title %}  {% endblock %}</title>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.0/css/bootstrap.min.css">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.0/js/bootstrap.min.js"></script>
<style>
/* Remove the navbar's default margin-bottom and rounded borders */
.navbar {
margin-bottom: 0;
border-radius: 0;
}
/* Add a gray background color and some padding to the footer */
footer {
background-color: #f2f2f2;
padding: 25px;
}
</style>
</head>
<body>
<nav class="navbar navbar-inverse">
<div class="container-fluid">
<div class="navbar-header">
<button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#myNavbar">
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<a class="navbar-brand" href="#">Phone Radar</a>
</div>
<div class="collapse navbar-collapse" id="myNavbar">
<ul class="nav navbar-nav">
<li class="active">#</li>
<li><a href="#">Add Phone</a></li>
<li><a href="#">Add Review</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
<li><a href="#"><span class="glyphicon glyphicon-log-in"></span> Login</a></li>
</ul>
</div>
</div>
</nav>
<div class="jumbotron">
<div class="container text-left">
{% block content %}  {% endblock %}
</div>
</div>

</body>
</html>

这是品牌列表.html文件的代码,该文件显示手机品牌列表。它位于GameReview文件夹>模板内。我已经设法在 http://127.0.0.1:8000/index 上展示了手机品牌。

{% extends 'PhoneReview/base.html' %}
{% load static %}
{% block title%}
Brand List
{% endblock %}
{% block content %}
<!--Page content-->
<h1>This is Brand List Page</h1>
<ul>
{% for brand in all_brands %}
<li>{{ brand.brand_name }}</li>
{% endfor %}
</ul>
<img src="{% static "images/brandlist.jpg" %}" alt="Super Mario Odyssey" /> <!-- New line -->
{% endblock %}

这是手机模型的代码.html文件,该文件应该显示手机品牌。但是,我无法在 http://127.0.0.1:8000/phonemodel/1/显示{{ phonemodel.model_name }}的输出。它只显示 H1 标题。该文件位于模板>游戏评论文件夹中。

{% extends 'PhoneReview/base.html' %}
{% load static %}
{% block title%}
Phone Model Page
{% endblock %}
{% block content %}
<!--Page content-->
<h1>This is Phone Model Page</h1>
<ul>
{% for phonemodel in all_phonemodel %}
<li>{{ phonemodel.model_name }}</li>
{% endfor %}
</ul>
<img src="{% static "images/brandlist.jpg" %}" alt="Super Mario Odyssey" /> <!-- New line -->
{% endblock %}

我被困在这里。手机型号.html应该显示手机品牌。但是,我无法在 http://127.0.0.1:8000/phonemodel/1/显示{{ phonemodel.model_name }}的输出。它只显示 H1 标题。没有显示任何错误。我尝试了几个小时来修复它。但是作为一个 Django 初学者,我面临着很难修复它的问题。

您的手机模型模板完全错误。您不仅在模板上下文中没有调用all_phonemodel的任何内容,即使您这样做了,它也不会可迭代,因为这是详细信息视图,而不是列表视图。

删除循环并仅访问object

<ul>
<li>{{ object.model_name }}</li>
</ul>

将其添加到您的"类模型视图"中:

context_object_name = 'all_phonemodel'
def get_queryset(self):
return PhoneModel.objects.all()