首页 > 解决方案 > 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">&nbsp; 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' %}" -->

标签: pythonhtmldjango

解决方案


您的网址似乎有点不同步。您已经包含了两次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 )


推荐阅读