Django - проблема с реализацией моделей и представлений в приложении PhoneReview - PullRequest
0 голосов
/ 26 октября 2019

Я новичок в Джанго. Я создаю приложение Django с именем PhoneReview. Он будет хранить отзывы, связанные с последним мобильным телефоном. Он также будет отображать бренды телефонов, а также соответствующие модели телефонов. Я уже создал модели для:

  1. Бренд - подробные сведения о бренде, такие как имя, происхождение, производство с тех пор и т. Д.

  2. Модель -сведения о модели, такие как название модели, дата запуска, платформа и т. д.

  3. Обзор - обзор статьи о мобильном телефоне и дате публикации и т. д.

  4. Отношение «многие ко многим» между Review и Model.

Теперь мне нужно создать представления для следующего:

a. Индексная страница, отображающая все бренды, доступные для мобильного телефона в базе данных

b. Страница модели телефона, на которой отображается модель при выборе бренда.

c. Подробная страница, когда выбрана модель, содержащая обзоры и новостную ссылку

Мне удалось создать представление для "a. Индексная страница, отображающая в базе данных все бренды, доступные для мобильного телефона." Однако я застрял с "b. Страница модели телефона, на которой отображается модель при выборе бренда."

Мне удалось отобразить страницу модели телефона. Однако название модели телефона не отображается. Итак, я чувствую, что есть проблема с представлениями или шаблонами. Но я не получаю никаких ошибок при запуске сервера. Итак, я немного запутался.

Вот коды models.py приложения PhoneReview .

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  

Воткоды urls.py приложения PhoneReview :

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'),
]

Вот коды views.py из PhoneReview app:

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'

Вот коды файла base.html . Как следует из названия, это базовая страница. Он будет расширен для использования другими страницами, например brandlist.html для отображения списка брендов телефонов и phonemodel.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>

Вот коды файла brandlist.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 %}

Вот коды файла phonemodel.html , который должен отображать марки телефонов. Тем не менее, я не могу отобразить вывод {{ phonemodel.model_name }} при http://127.0.0.1:8000/phonemodel/1/. Это просто показывает заголовок H1. Файл находится внутри шаблонов> папка GameReview.

{% 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 %}

Я застрял здесь. phonemodel.html должен отображать бренды телефонов. Тем не менее, я не могу отобразить вывод {{ phonemodel.model_name }} в http://127.0.0.1:8000/phonemodel/1/. Это просто показывает заголовок H1. Там нет ошибок, показывая. Я пытался несколько часов, чтобы исправить это. Но, будучи новичком в Django, я сталкиваюсь с трудностями в его исправлении.

Ответы [ 2 ]

1 голос
/ 26 октября 2019

Ваш шаблон телефонной модели совершенно неверный. Мало того, что у вас нет ничего под названием all_phonemodel в контексте шаблона, даже если вы сделали это, оно не будет итеративным, потому что это представление detail , а не представление списка.

Удалить петлю и просто получить доступ к object:

<ul>
    <li>{{ object.model_name }}</li>
</ul>
0 голосов
/ 26 октября 2019

Добавьте это к вашему «классу ModelView»:

context_object_name = 'all_phonemodel'

def get_queryset(self):
        return PhoneModel.objects.all()
...