大家好,怎么回事?
我刚刚开始使用Django,我已经开始了解它;我需要建立一个关于汽车的网站,有两个主要的APPS:
CarsCatalogue;
新闻栏目;
我发现我可以从管理面板管理新闻非常有用。我创建了典型的模型:
class Post(models.Model):
title = models.CharField(max_length = 140)
date = models.DateTimeField()
body = models.TextField()
def __str__(self):
return self.title
使用urls.py如下
url(r'^(?P<pk>\d+)$', DetailView.as_view(
model = Post,
template_name="news/post.html"))
url(r'^$', ListView.as_view(
queryset=Post.objects.all().order_by("-date")[:25],
template_name="news/news.html")),
太好了!我可以从管理面板轻松管理新闻应用程序。现在我有一个每个新闻的页面:news / 1;新闻/ 2等;
但是当我进入CarsCatalogue时,我真的需要简化我的生活,因为我有很多汽车都有个人页面要添加,我发现自己需要修改每辆车的urls.py我需要添加,似乎我必须为每辆车修改views.py - 我正在使用渲染 - 我是对的吗?
我的意思是,拥有一百个不同函数调用一百页的Views.py是否有意义? 然后,如果我想创建一个包含CarCatalogue所有网址的列表,必须逐个编写每个链接? 这是在这种情况下使用Django的方式吗?
我会为CarsCatalogue创建另一个“新闻式”APP,这对我来说通过管理面板进行管理会更容易,但我需要每个网址显示汽车名称,例如:CarsCatalogue / Seat-Ibiza而不是像CarsCatalogue / 1。
也许我可以做类似新闻APP的事情,但改变生成和显示网址的方式?
在我阅读文档和几个Google主题和其他资源后,我问你所有这些; 我希望你们能清除我头上的雾气;
有了这样一个社区应得的所有尊重,
此致
-oKi
编辑n * 1
这是3个小时的阅读,尝试,修改,删除,再次尝试。 我读了很多东西,但与此同时我对pheraps更加困惑,因为我找到了很多东西,同时寻找如何“slu”“如果你的网址(这确实是我正在寻找的东西[现在我确实可以使用管理面板做我想做的事情!]谢谢)我最终混合了很多东西。所以,使用NEWS应用程序,到目前为止我所做的:
python3.5 manage.py flush,makemigrations,migrate,createsuperuser
我修改了news / models.py,现在看起来像这样:
from django.db import models
from django.template.defaultfilters import slugify
class Post(models.Model):
title = models.CharField(max_length = 140)
date = models.DateTimeField()
body = models.TextField()
slug = models.SlugField(title, max_length=100, unique=True)
def __str__(self):
return self.title
def slug(self):
return slugify(self.title)
我修改了news / admin.py,现在它看起来像这样:
from django.contrib import admin
from news.models import Post
admin.site.register(Post)
class NewsAdmin(admin.ModelAdmin):
prepopulated_fields = {"slug": (Post.slug)} <!-- that seems makes sense looking at the Model - I also tryed {"slug": (title,)}, {"slug": (Post.title)}-->
我修改了news / urls.py,现在看起来像这样:
from django.conf.urls import url
from django.views.generic import ListView, DetailView
from news.models import Post
urlpatterns = [
url(r'^$', ListView.as_view(
queryset=Post.objects.all().order_by("-date")[:25],
template_name="news/news.html")),
url(r'^(?P<slug>[\w-]+)$', DetailView.as_view(
model = Post,
template_name="news/post.html")),
]
然后我给: python3.5 manage.py runserver 它运行没有问题。 所以我去/ admin,我创建一个新帖子,它创建它... 但那会发生什么? 它仍然使用旧的“范例”来生成URL,包括它在我擦除客户端之前使用的旧密钥(id)...所以......我期望的是像mysite / news / new-human-一级urld新闻 原来是mysite / news / 11。
LOL:D,幸运的是,浏览器也给我一个错误......
/ news / 11中的FieldError 无法将关键字'slug'解析为字段。选择是:身体,日期,身份,标题“目前我找不到答案,我找到了很多东西,我只是不知道如何混淆。我会一直在寻找。感谢帮助!谢谢你! :D
答案 0 :(得分:0)
根据我对您的问题的理解,您需要的不是为您拥有的每辆车创建一个视图功能。 实际上,您需要创建一个描述CarsCatalogue的模板(html页面),其中所有CarsCatalogue具有相同的结构和不同的信息。然后用户选择一个CarsCatalogue,让我们从下拉控件中说出,然后从数据库加载数据并在模板中显示结果。 为了实现这一目标,请查看以下主题: Django forms。为了从数据库中获取您的数据,您需要在网址中传递ID,您可以看到此答案how to pass an id in django url或来自官方网站URL Dispatcher。
简而言之,django是一种简单的方式来建立您的网站,绝对不需要多次重写您的代码。
答案 1 :(得分:0)
没有必要创建多个URL。
根据我的理解,您需要每辆车的目录。
只需创建一个显示所有汽车名称的视图。
然后当您点击汽车时,在获取请求中向另一个视图函数发出获取请求,传递您选择的汽车详细信息。现在使用Django模板。为您的目录创建一个Django模板,将汽车特定数据传递给它。
您需要了解Django模板,我认为Django模板可以解决您的问题。
答案 2 :(得分:0)
我认为您缺少的是URL中的参数可以是任何内容,而不仅仅是数字URL。如果它是一个字符串,我们称之为slug,如果设置prepopulated_fields
选项,Django管理员将自动从模型中的字段创建一个slug。
然后,您可以在URL中使用该slug:
url(r'^(?P<slug>[\w-]+)$', DetailView.as_view(
model = Car,
template_name="news/car.html"))
并且Django将使用该字段而不是ID来查找要显示的正确内容。
答案 3 :(得分:0)
我找到了解决问题的方法。
即使我开始询问CARS目录,我也将使用NEWS APP解释我所做的事情,因为逻辑是相同的,因为那是我在帖子的第一个编辑中修改过的APP。 在模板内部,有一个“news.html”页面用于呈现所有帖子的列表,还有一个“post.html”用于呈现每个帖子。
以下是有关如何设置可以直接从ADMIN PANEL管理并且使用SLUG字段作为URL的APP的过程的一部分。
models.py:
from django.db import models
class Post(models.Model):
title = models.CharField(max_length = 140)
body = models.TextField()
slug = models.SlugField(unique=True)
def __str__(self):
return self.title
admin.py:
from django.contrib import admin
from news.models import Post
class PostAdmin(admin.ModelAdmin):
model = Post
prepopulated_fields = {'slug': ('title',)}
admin.site.register(Post, PostAdmin)
urls.py:
from django.conf.urls import url
from django.views.generic import ListView, DetailView
from news.models import Post
urlpatterns = [
url(r'^$', ListView.as_view(
queryset=Post.objects.all(),
template_name="news/news.html")),
url(r'^(?P<slug>[\w-]+)$', DetailView.as_view(
queryset=Post.objects.all(),
model = Post,
template_name="news/post.html")),
]
我希望这对某人有用。
Jeez你必须努力学习这个框架:D
感谢大家的支持,c ya :)