Django 3 - URL-адрес в виде заглушки и заголовка в Django Подробное описание и представление списка, а не int? - PullRequest
0 голосов
/ 05 мая 2020

В Django 3, каков правильный метод создания списка и подробного представления с дружественными URL-адресами с заглушкой или кратким названием имени, а не целым числом pk? view

Я хочу иметь возможность использовать список и подробный вид с удобочитаемыми URL-адресами, более удобными, чем number или int? Я пробовал множество руководств, но все они используют разные методы, такие как url, path, re path, include, reverse, reverse lazy et c.

Мне удалось использовать шаблоны URL-адресов примерно так, но это метод int


r'^starwars/(?P<pk>\d+)$'

Я пытаюсь сделать что-то вроде этого. он будет использовать шаблон, унаследованный от базового шаблона как для списковых, так и для подробных представлений. `` `

http://127.0.0.1:8000/   #as homepage
http://127.0.0.1:8000/starwars/  #as list of series
http://127.0.0.1:8000/starwars/the_mandalorian/ # page is detailed view with list of the mandalorian characters
 ```

Вместо


   http://127.0.0.1:8000/   #as homepage
   http://127.0.0.1:8000/starwars/  #as list of series
   http://127.0.0.1:8000/starwars/1/ 

путь к шаблонам

Project_folder | _ starwars | _ templates | _ starwars | _
starwars_base. html starwars_detail. html starwars_list. html

------ Settings.py -------

Я добавляю сюда каталоги шаблонов, например это в двух местах


# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
TEMPLATE_DIR = os.path.join(BASE_DIR,'templates')


ROOT_URLCONF = 'starwars.urls'

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [TEMPLATE_DIR,],
        'APP_DIRS': True,

        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.media',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]


urls.py


from django.shortcuts import render
from django.views.generic import View, TemplateView, ListView, DetailView
from . import models

class IndexView(TemplateView):
    template_name = 'index.html'

class StarwarsListView(ListView):
    context_object_name = 'starwars'
    model = models.Starwars
    # returns widget_list

class StarwarsDetailView(DetailView):
    context_object_name = 'starwars_detail'
    model = models.Starwars
    template_engine = 'starwars/starwars_detail.html'

------ MY MODELS.PY -------



from django.db import models

# Create your models here.
class Starwars(models.Model):
    name = models.CharField(max_length=256)
    Principal = models.CharField(max_length=256)
    location = models.CharField(max_length=256)

    def __str__(self):
        return self.name

class Character(models.Model):
    name = models.CharField(max_length=256)
    type = models.CharField(max_length=256)
    Starwars = models.ForeignKey(Starwars,  on_delete=models.CASCADE, related_name='characters')

    def __str__(self):
        return self.name

------ views.py -------



from django.shortcuts import render
from django.views.generic import View, TemplateView, ListView, DetailView
from django.http import HttpResponse
from . import models


class IndexView(TemplateView):
    template_name = 'index.html'

class StarwarsListViewListView(ListView):
    context_object_name = 'starwars'
    model = models.Starwars
    # returns starwars_list

class StarwarsDetailViewDetailView(DetailView):
    context_object_name = 'starwars_detail'
    model = models.Starwars
    template_engine = 'starwars/starwars_detail.html'

------ СПИСОК Звездных войн HTML ------- это будет отображать список названий серий, когда щелкнет переход к страницам с подробностями одной конкретной c серии.


{% extends "starwars/starwars_base.html" %}

{% block body_block %}

<h1>Welcome to a list of all the Character!! </h1>
<ol> 
    {% for starwar in starwars %}
    <h2><li><a href="{{starwars.id}}">{{starwars.name}}</a></li></h2>
    {% endfor %}
</ol>

{% endblock %}

------ Подробности Starwars HTML ------- это будет отобразить название серии. Пример Мандалорианец со списком персонажей и различной информацией.


{% extends "starwars/starwars_base.html" %}

{% block body_block %}

<div class="jumbotron">


<h1>Welcome to the Starwars Detail Page </h1>
    <h2></h2>
    <p><b>Name of series: </b>{{starwars_detail.name}}</p>
    <p><b>Type: </b> {{starwars_detail.type}}</p>
    <p><b>Location: </b>{{starwars_detail.location}}</p>
    <h3><b>Characters: </b></h3>

{% for student in school_detail.students.all %}
 <p>{{starwars.name}} who's student id is a {{starwars.info}}</p>
{% endfor %}

</div>


{% endblock %}

----- Basi c Bootstrap Base HTML ----


<!doctype html>
<html lang="en">
  <head>
    <!-- Required meta tags -->
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">

    <!-- Bootstrap CSS -->
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css" integrity="sha384-Gn5384xqQ1aoWXA+058RXPxPg6fy4IWvTNh0E263XmFcJlSAwiGgFAW/dAiS6JXm" crossorigin="anonymous">

  </head>
    <body>
      <nav class="navbar navbar-default navbar-static-top">
        <ul class="nav navbar-nav">
          <li><a class="navbar-brand" href="{% url 'starwar:list' %}">Starwars Series</a></li>
          <li><a class="navbar-link" href="{% url 'admin:index' %}">Admin</a></li>
          <li><a class="navbar-link" href="#"></a></li>
        </ul>
    </nav>
  </br>
        <div class="container">

            {% block body_block %}
            {% endblock %}
        </div>

   <!-- Optional JavaScript -->
    <!-- jQuery first, then Popper.js, then Bootstrap JS -->
    <script src="https://code.jquery.com/jquery-3.2.1.slim.min.js" integrity="sha384-KJ3o2DKtIkvYIK3UENzmM7KCkRr/rE9/Qpg6aAZGJwFDMVNA/GpGFF93hXpG5KkN" crossorigin="anonymous"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.9/umd/popper.min.js" integrity="sha384-ApNbgh9B+Y1QKtv3Rn7W3mgPxhU9K/ScQsAP7hUibX39j7fakFPskvXusvfa0b4Q" crossorigin="anonymous"></script>
    <script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/js/bootstrap.min.js" integrity="sha384-JZR6Spejh4U02d8jOt6vLEHfe/JQGiRRSQQxSfFWpi1MquVdAyjUar5+76PVCmYl" crossorigin="anonymous"></script>
  </body>
</html>


Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...