В 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>