首页 > 解决方案 > 来自 DB 文件值的 Django URL 路径

问题描述

我正在尝试创建使用 {{ project.title }} 值生成路径的“项目”页面,而不是使用整数的当前方法。我不太明白我怎么能做到这一点,但觉得我很接近?

模型.py

from django.db import models

# Create your models here.
class Project(models.Model):
    title = models.CharField(max_length=100)
    description = models.TextField()
    technology = models.CharField(max_length=20)
    image = models.FilePathField(path='projects/static/img/')
    live = models.URLField()
    source = models.URLField()

    def __str__(self):
        return self.title

网址.py

from django.urls import path
from . import views

urlpatterns = [
    path("", views.project_index, name="projects"),
    path("<int:pk>/", views.project_details, name="project_details"),  # PK for Primary Key
]

视图.py

from django.shortcuts import render
from .models import Project

# Create your views here.
def project_index(request):
    projects = Project.objects.all()
    context = {'projects': projects}
    return render(request, 'projects/project_index.html', context)

def project_details(request, pk):
    project = Project.objects.get(pk=pk)
    context = {'project': project}
    return render(request, 'projects/project_details.html', context)

path("<int:pk>/",认为需要成为一个蛞蝓,但我就是不知道如何绑定数据库数据。可能context = {'project': project}吗?

目前的网址是http://127.0.0.1:8000/projects/1/ - 我正在寻找http://127.0.0.1:8000/projects/EXAMPLE/

谢谢

标签: pythondjangodjango-viewsdjango-templates

解决方案


SlugField您必须在文件中添加一个models.py

模型.py

from django.db import models
from django.utils.text import slugify

# Create your models here.
class Project(models.Model):
    title = models.CharField(max_length=100)
    description = models.TextField()
    technology = models.CharField(max_length=20)
    image = models.FilePathField(path='projects/static/img/')
    live = models.URLField()
    source = models.URLField()
    slug = models.SlugField(default="", blank=True, null=False, db_index=True)

    def __str__(self):
        return self.title

    def save(self, *args, **kwargs):
        self.slug = slugify(self.title)
        super().save(*args, **kwargs)

视图.py

from django.shortcuts import render
from .models import Project

# Create your views here.
def project_index(request):
    projects = Project.objects.all()
    context = {'projects': projects}
    return render(request, 'projects/project_index.html', context)

def project_details(request, slug):
    project = Project.objects.get(slug=slug)
    context = {'project': project}
    return render(request, 'projects/project_details.html', context)

网址.py


from django.urls import path
from . import views

urlpatterns = [
    path("", views.project_index, name="projects"),
    path("<slug:slug>/", views.project_details, name="project_details"),
]

确保运行makemigrations,然后migrate.


推荐阅读