【问题标题】:Django - Incorporating new models with their own pagesDjango - 将新模型与他们自己的页面结合起来
【发布时间】:2021-06-01 11:17:20
【问题描述】:

我已经设法在我的 Django 项目中设置了一个模型,并且可以在其中创建帖子并通过视图和模板显示这些帖子,但是,我似乎无法对新模型做同样的事情。已创建。我已经尝试像对初始模型所做的那样执行此操作,即设置自己的 html 文件,就像第一个一样,以及主项目文件夹中 urls.py 和 view.py 中的类似条目应用程序文件夹。

编辑以获得更多上下文:基本上,文章模型已使用模板 article_detail.html 和 article_list.html 设置,并且该模型中的所有条目都是从管理应用程序中提取的,并且是可见。我已经创建了另一个模型,进攻性,并且也想对文章条目做同样的事情,所以我尝试复制我所做的并将进攻性模型制作为自己的模板(offensive_detail.html 和进攻性列表.html:)。 然而,这似乎没有奏效。在 base_template.html 上为 Offensive 创建一个链接不会去任何地方,它只是停留在同一页面上。不会重定向到将显示攻击性文章列表的攻击性详细信息页面。

我的目的是让不同的类别与不同的模型保持一致,并将所有这些类别和相应的页面作为导航栏中的链接。

我不完全确定我哪里出错了,或者即使我几乎是正确的。 非常感谢您的帮助。

Here is the folder structure of my project

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 %}

offensive_detail.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 %}

offensive_list.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 %}

models.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

urls.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"),

]

views.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 })

从主文件夹“网站”:

ursl.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' %}" -->

【问题讨论】:

  • 我从您的帖子中不清楚实际问题是什么。请描述您遇到了什么错误,或者什么没有按预期工作。
  • 抱歉,来晚了,我的大脑被炸了。包含并编辑以上更多上下文。
  • 谢谢,但我仍然不清楚这个问题。我认为相关的句子是“在 base_template.html 上为 Offensive 创建链接不会去任何地方。” - 但你似乎没有分享 base_template ,我也不知道“哪儿也不去”是什么意思。如果您的意思是单击链接时似乎什么都不做,您是否尝试过检查实际的 HTML?
  • 再次更新以包含 base_template.html 并进一步澄清:“在 base_template.html 上为 Offensive 创建链接不会去任何地方,它只是停留在同一页面上。不会重定向到令人反感的详细信息页面,将显示令人反感的文章列表。”基本上,如何在导航栏中为我的应用程序中的每个模型创建链接,以显示我在这些模型中创建的条目?

标签: python html django


【解决方案1】:

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

【讨论】:

  • 感谢您的回复!我已经尝试过你所说的,但我收到错误消息说它找不到“攻击性”模块。如果我要包含这样的内容:``` url(r'^offensive/', include('offensive.urls')), ``` 我需要为此制作一个单独的应用程序吗?
  • 如果你想要一组单独的攻击性网址,那么你可能想要一个应用程序,但你不需要它。如果您愿意,您可以将它们全部放在articles.urls 中,但您的网址将以文章作为前缀。尝试多合一的解决方案以使事情正常进行,然后如果您有太多(您自己的偏好)进行,则将事情打破。
  • 所以我不介意文章作为前缀,但除了我已经做过的事情之外,我真的不知道该怎么做。这是否意味着我不需要进攻详细信息.html 和进攻清单.html,我只使用文章列表/详细信息 .html 文件?为进一步的问题道歉。我真的很难弄清楚我是如何做到这一点的。
  • 编辑您的问题,列出您想要的 url 以及每个人应该做什么视图,然后我们可以向您展示一个 url 模式来完成。
猜你喜欢
  • 2018-09-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多