【问题标题】:How can I customize url output?如何自定义 url 输出?
【发布时间】:2018-08-14 12:03:14
【问题描述】:

我正在构建一个使用 Django 进行设备管理的站点。我目前正在使用this tutorial to help me get started.

我希望在浏览器的 url 栏中显示的 url 显示如下内容:

127.0.0.1:8000/catalog/model/model_number

但目前,当我单击每个单独的模型时,它只显示一个整数,例如 1、2、3 等。

这是我的urls.py

from django.urls import path
from . import views

urlpatterns = [
    path('', views.index, name='index'),
    path('books/', views.BookListView.as_view(), name='books'),
    path('book/<int:pk>', views.BookDetailView.as_view(), name='book-detail'),
    path('models/', views.ModelListView.as_view(), name='models'),
    path('model/<int:pk>', views.ModelDetailView.as_view(), name='model-detail'),
]

我知道path('model/&lt;int:pk&gt;'... 是应该更改的部分。我试过path('model/model.model_number&gt;'... 但这会输出以下错误:

Reverse for 'model-detail' with arguments '('2',)' not found. 1 pattern(s) tried: ['catalog\\/model\\/\\<model\\.model_number\\>$']

这是我的models.py

from django.db import models
from django.urls import reverse #Used to generate URLs by reversing the URL patterns
import uuid
import datetime

# Create your models here.

class Genre(models.Model):
    """Model representing book genre"""
    name = models.CharField(max_length = 200, help_text = 'Enter book genre')

    def __str__(self):
        """String for represnting model object."""
        return self.name

class Book(models.Model):
    """Model representing a book (but not a specific copy of a book)"""
    title = models.CharField(max_length = 200)
    author = models.ForeignKey('Author', on_delete = models.SET_NULL, null = True)

    # Foreign Key used because book can only have one author, but authors can have multiple books
    # Author as a string rather than object because it hasn't been declared yet in the file.
    summary = models.TextField(max_length = 1000, help_text = 'Enter brief descp. of book') #TextField for longer descp.
    isbn = models.CharField('ISBN', max_length = 13, help_text = '13 character <a href="https://www.isbn-international.org/content/what-isbn">ISBN number</a>')

    #ManyToManyField used because genre can contain many books. Books can cover many genres.
    #Genre class has already been defined so we can specify the object above.
    genre = models.ManyToManyField(Genre, help_text = 'Select genre for this book') #Genre capitalized, calling model up

    def __str__(self):
        """String for representing the Model object."""
        return self.title

    def get_absolute_url(self):
        """returns the URL to access a detail record for this book."""
        return reverse('book-detail', args=[str(self.id)])

class BookInstance(models.Model):
    """Model representing a specific copy of a book"""
    id = models.UUIDField(primary_key = True, default = uuid.uuid4, help_text = 'Unique ID for this book across whole library')
    book = models.ForeignKey('Book', on_delete=models.SET_NULL, null = True)
    imprint = models.CharField(max_length = 200)
    due_back = models.DateField(null = True, blank = True) #could do date scanned (date.now())

    LOAN_STATUS = (   #could be ownership! Or make more of these for location
        ('m', 'Maintenance'),  #being worked on, cleaned after field
        ('o', 'On loan'),   #in the field
        ('a', 'Available'),   #ready to go
        ('r', 'Reserved'),       #in the field, could add one for 'being tested'
    )

    status = models.CharField(
        max_length = 1,
        choices = LOAN_STATUS,
        blank = True,
        default = 'm',
        help_text = 'Book availability',
    )

    class Meta:
        ordering = ['due_back']

    def __str__(self):
        """String for representing the Model object."""
        return f'{self.id} ({self.book.title})' #Will pop up on admin page as this

class Author(models.Model):
    """Model representing an author"""
    first_name = models.CharField(max_length = 100)
    last_name = models.CharField(max_length = 100)
    date_of_birth = models.DateField(null = True, blank = True)
    date_of_death = models.DateField('Died', null = True, blank = True)

    class Meta:
        ordering = ['last_name', 'first_name']

    def get_absolute_url(self):
        """Returns the url to access a particular author instance."""
        return reverse('author-detail', args=[str(self.id)])

    def __str__(self):
        """String for representing the Model object."""
        return f'{self.last_name}, {self.first_name}' #Will pop up on admin page as this

class Location(models.Model):
    town_city_base = models.CharField('Town/City/Base', max_length = 25, help_text="If location is classified enter CLASSIFIED in CAPS")
    state = models.CharField(max_length = 25)
    country = models.CharField(max_length = 25)

    class Meta:
        ordering = ['town_city_base', 'state', 'country']

    def get_absolute_url(self):
        #Returns the url to access a particular location instance
        return reverse('location-detail', args=[str(self.id)])

    def __str__(self):
        #String for representing the Model object
        return f'{self.town_city_base}, {self.state}, {self.country}'

class Category(models.Model):
    category = models.CharField('Equipment Type', max_length = 50, help_text = "Enter general category of equipment")

    class Meta:
        verbose_name_plural = "categories" #default would have shown as "Categorys" on admin page

    def __str__(self):
        return self.category

class Manufacturer(models.Model):
    manufacturer = models.CharField(max_length = 50, help_text = "Original manufacturer or supplier")

    def __str__(self):
        return self.manufacturer

class Model(models.Model):
    model_number = models.CharField('Model Number', max_length = 50)
    manufacturer = models.ForeignKey('Manufacturer', on_delete = models.SET_NULL, null = True)
    category = models.ForeignKey('Category', on_delete = models.SET_NULL, null = True)
    description = models.TextField(max_length = 1000, help_text = "Enter brief description of product", null = True) #TextField for longer descriptions

    def __str__(self):
        return f'{self.model_number}..........{self.description}'

    def get_absolute_url(self):
        #Returns the url to access a particular location instance
        return reverse('model-detail', args=[str(self.id)])

class Ownership(models.Model):
    ownership = models.CharField('Ownership', max_length = 50)

    class Meta:
        verbose_name_plural = "Owners"

    def __str__(self):
        return self.ownership

    def get_absolute_url(self):
        return reverse('ownership-detail', args=[str(self.id)])


class ModelInstance(models.Model):
    asset = models.CharField('Asset Number', max_length = 50, help_text = "Enter Weston or Government I.D. Tag Number")
    model = models.ForeignKey('Model', on_delete = models.SET_NULL, null = True, help_text = "Leave blank if no model number exists")
    serial = models.CharField('Serial Number', max_length = 50, null = True, blank = True, help_text = "Leave blank if no serial number exists")
    location = models.ForeignKey('Location', on_delete = models.SET_NULL, null = True, help_text = "Enter current location or location after manufacturing")
    ownership = models.ForeignKey('Ownership', on_delete = models.SET_NULL, null = True, help_text = "Enter current owner of equipment")

    STATUS = (
        ('M', 'Maintenance'),  #being worked on, not available
        ('D', 'Deployed'),   #in the field
        ('A', 'Available'),   #ready to go
        ('R', 'Reserved'), #Being used for classified/other project
        ('K', 'Broken'), #Broken
    )

    status = models.CharField(
        max_length = 1,
        choices = STATUS,
        blank = True,
        default = 'A',
        help_text = 'Equipment Availability',
    )

    note = models.TextField('Notes', max_length = 1000, null = True, blank = True)

    date_added = models.DateField("Date Added", default=datetime.date.today)

    def __str__(self):
        return f'Asset Number: {self.asset}..........Serial Number: {self.serial}..........Location: {self.location}..........Ownership: {self.ownership}'

【问题讨论】:

    标签: django django-models django-urls


    【解决方案1】:

    你不使用 url 来访问模型的字段,所以

    model.model_number&gt;

    不会帮你的。

    如果你想要这个网址:

    /catalog/model/model_number
    

    您必须按原样对其进行编码:

    path('catalog/model/model_number/<int:pk>/', views.ModelDetailView.as_view(), name='model-detail'),
    

    ]

    最好在结尾加上反冲。

    请记住,如果应用名称为 catalog,则无需将其添加到路径中。

    现在当然需要将 pk 传递给视图以检索您想要的对象,因此您将在浏览器中拥有这个 url:

    127.0.0.1:8000/catalog/model/model_number/1/
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-04-03
    • 1970-01-01
    • 1970-01-01
    • 2010-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多