python - Django - 将新模型与他们自己的页面结合起来
问题描述
我已经设法在我的 Django 项目中设置了一个模型,并且可以在其中创建帖子并通过视图和模板显示这些帖子,但是,我似乎无法对我创建的新模型做同样的事情。我尝试像对初始模型所做的那样执行此操作,即设置自己的 html 文件,就像第一个一样,以及主项目文件夹中 urls.py 和 view.py 中的类似条目应用程序文件夹。
编辑以获取更多上下文:基本上,文章模型已使用模板 article_detail.html 和 article_list.html 设置,并且该模型中的所有条目都从管理应用程序中提取并且可以查看。我创建了另一个模型,进攻性,并且也想对文章条目做同样的事情,所以我尝试复制我所做的并将进攻性模型制作为自己的模板(offensive_detail.html 和进攻性列表.html:)。然而,这似乎没有奏效。在 base_template.html 上为 Offensive 创建链接不会去任何地方,它只是停留在同一页面上。不重定向到将显示攻击性文章列表的攻击性详细信息页面。
我的目的是让不同的类别与不同的模型保持一致,并将所有这些类别和相应的页面作为导航栏中的链接。
我不完全确定我哪里出错了,或者即使我接近正确。帮助将不胜感激。
app文件夹下的文件:
article_detail.html:
{% extends 'base_layout.html' %}
{% block content %}
<div class="article-detail">
<div class="article">
<h2>{{ article.title }}</h2>
<p>{{ article.body }}</p>
<p>{{ article.date }}</p>
</div>
</div>
{% endblock %}
article_list.html:
{% extends 'base_layout.html' %}
{% block content %}
<h1>Articles List</h1>
<div class="articles">
{% for article in articles %}
<div class="article">
<h2><a href="{% url 'articles:detail' slug=article.slug %}">{{ article.title }}</a></h2>
<p>{{ article.date }}</p>
</div>
{% endfor %}
</div>
</body>
{% endblock %}
进攻细节.html:
{% extends 'base_layout.html' %}
{% block content %}
<div class="offensive_articles">
<div class="offensive_list">
<h2>{{ offensive_article.title }}</h2>
<p>{{ offensive_article.body }}</p>
<p>{{ offensive_article.date }}</p>
</div>
</div>
{% endblock %}
进攻列表.html:
{% extends 'base_layout.html' %}
{% block content %}
<h1>Offensive Articles List</h1>
<div class="offensive_articles">
{% for offensive_article in offensive_articles %}
<div class="offensive_article">
<h2><a href="{% url 'articles:offensive_article' slug=article.slug %}">{{ offensive_article.title }}</a></h2>
<p>{{ offensive_article.date }}</p>
</div>
{% endfor %}
</div>
</body>
{% endblock %}
模型.py:
from django.db import models
from PIL import Image
# Create your models here.
class Article(models.Model):
title = models.CharField(max_length=100)
slug = models.SlugField() # URL of post
body = models.TextField()
date = models.DateTimeField(auto_now_add=True) # auto populate with the current time
thumb = models.ImageField(default='default.jpg', blank=True)
# add in author
def __str__(self):
return self.title
class Offensive(models.Model):
title = models.CharField(max_length=100)
slug = models.SlugField() # URL of post
body = models.TextField()
date = models.DateTimeField(auto_now_add=True) # auto populate with the current time
thumb = models.ImageField(default='default.jpg', blank=True)
def __str__(self):
return self.title
网址.py:
from django.urls import path
from django.conf.urls import url
from . import views
app_name = 'articles'
urlpatterns = [
url(r'^$', views.article_list, name="list"),
url(r'^$', views.offensive_list, name="offensive_list"),
url(r"^(?P<slug>[\w-]+)/$", views.article_detail, name="detail"),
url(r"^(?P<slug>[\w-]+)/$", views.offensive_detail, name="offensive_detail"),
]
视图.py:
from django.http import HttpResponse
from django.shortcuts import render
from .models import Article, Offensive, Defensive, Fitness, Coding
def article_list(request):
articles = Article.objects.all().order_by('date')
return render(request, 'articles/article_list.html', {'articles': articles})
def about(request):
#return HttpResponse('about')
return render(request, 'about.html')
def article_detail(request, slug):
#return HttpResponse(slug)
article = Article.objects.get(slug=slug)
return render(request, 'articles/article_detail.html', { 'article':article })
def offensive_list(request):
offensive_articles = Offensive.objects.all().order_by('date')
return render(request, 'articles/offensive_list.html', { 'offensive_article': offensive_article })
def offensive_detail(request, slug):
#return HttpResponse(slug)
offensive_article = Offensive.objects.get(slug=slug)
return render(request, 'articles/offensive_detail.html', { 'offensive_article': offensive_article })
从主文件夹“网站”:
url.py:
"""website URL Configuration
The `urlpatterns` list routes URLs to views. For more information please see:
https://docs.djangoproject.com/en/3.1/topics/http/urls/
Examples:
Function views
1. Add an import: from my_app import views
2. Add a URL to urlpatterns: path('', views.home, name='home')
Class-based views
1. Add an import: from other_app.views import Home
2. Add a URL to urlpatterns: path('', Home.as_view(), name='home')
Including another URLconf
1. Import the include() function: from django.urls import include, path
2. Add a URL to urlpatterns: path('blog/', include('blog.urls'))
"""
from django.contrib import admin
from django.urls import path, include
from django.conf.urls import url, include
from . import views
from articles import urls
from django.contrib.staticfiles.urls import staticfiles_urlpatterns
from django.conf.urls.static import static
from django.conf import settings
from articles import views as article_views
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^articles/', include('articles.urls')),
url(r'^about/$', views.about),
url(r'^$', article_views.article_list, name="home"),
url(r'^offensive/', include('articles.urls')),
url(r'^$', article_views.offensive_list, name="offensive"),
]
urlpatterns += staticfiles_urlpatterns()
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
base_template.html:
{% load static %}
<!-- Bootstrap CDN -->
<link rel="stylesheet" href="{% static 'styles.css' %}" />
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous">
<link rel="preconnect" href="https://fonts.gstatic.com">
<link href="https://fonts.googleapis.com/css2?family=Montserrat&family=Orbitron:wght@900&display=swap" rel="stylesheet">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
<!-- Bootstrap JS -->
<script src="https://code.jquery.com/jquery-3.3.1.slim.min.js" integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo" crossorigin="anonymous"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js" integrity="sha384-UO2eT0CpHqdSJQ6hJty5KVphtPhzWj9WO1clHTMGa3JDZwrnQq4sF86dIHNDz0W1" crossorigin="anonymous"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js" integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" crossorigin="anonymous"></script>
<!-- this will apear everywhere -->
<!DOCTYPE html>
<html>
<head>
<title>Articles</title>
<nav class="navbar navbar-dark bg-dark">
<div class="container-fluid">
<!-- Logo -->
<div class="navbar-header">
<!-- <button class="navbar-toggler navbar-toggler-left" type="button" data-toggle="collapse" data-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button> -->
<a class="navbar-brand" href="{% url 'home' %}" style="font-family: 'Montserrat', sans-serif; font-family: 'Orbitron',sans-serif; color:red;">Neophyte</a>
</div>
<!-- Item -->
<div>
<ul class="nav navbar-nav">
<li class="active">
<a href="{% url 'offensive' %}" style="font-family: 'Montserrat', sans-serif; font-family: 'Orbitron',sans-serif; color:white"> Offensive
</a>
</li>
</div>
</div>
</nav>
</head>
<body>
<div class="wrapper">
{% block content %}
{% endblock %}
</div>
</body>
</html>
<!-- <img src="{% static 'Neophyte_logo.jpg' %}"/> -->
<!-- href="{% url 'offensive' %}" -->
解决方案
您的网址似乎有点不同步。您已经包含了两次articles.urls 和两个匹配'r'^$' 的模式。
你有什么:
url(r'^admin/', admin.site.urls),
url(r'^articles/', include('articles.urls')),
url(r'^about/$', views.about),
url(r'^$', article_views.article_list, name="home"),
url(r'^offensive/', include('articles.urls')),
url(r'^$', article_views.offensive_list, name="offensive"),
我认为你可能想要的:
url(r'^admin/', admin.site.urls),
url(r'^articles/', include('articles.urls')),
url(r'^offensive/', include('offensive.urls')),
url(r'^about/$', views.about),
# pick one of the following that you want for the root url
# currently will match the first one.
url(r'^$', article_views.article_list, name="home"),
url(r'^$', article_views.offensive_list, name="offensive"),
或者如果只是模型分离,把它们合二为一?
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^articles/', views.article_list, name="article_list"),
url(r"^articles/(?P<slug>[\w-]+)/$", views.article_detail, name="article_detail"),
url(r'^offensive/', views.offensive_list, name="offensive_list"),
url(r"^offensive/(?P<slug>[\w-]+)/$", views.offensive_detail, name="offensive_detail"),
url(r'^about/$', views.about),
url(r'^$', views.about, name="home"),
]
此外,您可能希望使用较新的路径,而不是 url ( https://docs.djangoproject.com/en/3.1/topics/http/urls/#example )
推荐阅读
- c# - 如何在 ASP.NET Core 3 中处理从 400 到 500 的异常
- bash - 如何使用 execv 合并命令?例如。ls | grep -c "表达式"
- java - Java OpenJDK 中缺少 JavaFX
- php - 当我尝试在我的项目 laravel 6.x 上使用 redis 时,它会显示此错误消息
- node.js - 将 nodejs MongoDB 连接代码移动到另一个文件
- javascript - 带有ajax json_encode的codeigniter不起作用
- asynchronous - 不能使用`impl Future`将异步函数存储在向量中
- odoo - 自定义小部件 js 无法识别来自 qweb 的模板
- ruby-on-rails - 安装 Rails 6.0.0 时出错:无法构建 gem 原生扩展
- cron - Quartz Web Restart 后的问题 - Quartz 触发所有已粘贴的计划作业