python - Django3 - 使用上下文处理器填充导航栏项目 SQlite DB 数据的问题
问题描述
我正在建立一个唱片公司网站,我想用来自 Artst 对象 Artist.objects.all() 的艺术家填充导航栏下拉列表。
我让它在一个应用程序“音乐”中工作,但只有当我将“/artistlist/”附加到末尾时。任何其他 URL 都不会填充该列表。
我希望列表始终作为导航栏项目存在。目前我正在尝试让 context_processors.py 工作。 youtube 教程我正在关注完全相同的问题
我可以使用一些帮助,因为我显然在做一些愚蠢的事情,或者忽略了一些基本的事情。在所有其他网址上,它会触发我添加的 else “我们目前还没有任何艺术家......”。
希望这对某人有意义。任何帮助是极大的赞赏。
base.html
<div class="dropdown-menu" aria-labelledby="navbarDropdownMenuLink">
<div class="dropdown-item" href="#">
{% if all_artists %}
<ul>
{% for artist in all_artists %}
<li class="dropdown-item">
<a href="{% url 'music:artist' artist.id %}">
<img src="{{ artist.artist_logo.url }}" style="width: 100px"><br>
{{ artist.artist_name }}<br>
{{ artist.artist_url }}<br>
</a>
</li>
{% endfor %}
</ul>
{% else %}
<h3>We currently dont have any artists yet..</h3>
{% endif %}
</div>
</div>
主要网址.py
from django.contrib import admin
from django.urls import include, path, re_path
from django.conf import settings
from . import views
from django.conf.urls.static import static
urlpatterns = [
path('admin/', admin.site.urls),
# include urls from the music app
path('music/', include('music.urls', namespace='music')),
# path('', include('music.urls', namespace='home')),
path('', include('blog.urls', namespace='blog')),
# path('single', include('blog.urls', namespace='single')),
]
if settings.DEBUG:
urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
音乐/模型.py
from django.db import models
# Create your models here.
class Artist(models.Model):
artist_name = models.CharField(max_length=250, default='')
artist_logo = models.FileField()
artist_url = models.URLField(blank=True)
def __str__(self):
return self.artist_name
class Release(models.Model):
artist = models.ForeignKey(Artist, on_delete=models.CASCADE)
release_title = models.CharField(max_length=500)
release_cover = models.FileField()
release_duration = models.IntegerField()
def __str__(self):
return self.release_title
class Track(models.Model):
release = models.ForeignKey(Release, default='', on_delete=models.CASCADE)
artist = models.ForeignKey(Artist, default='', on_delete=models.CASCADE)
track_title = models.CharField(max_length=200)
track_version = models.CharField(max_length=200)
track_genre = models.CharField(max_length=100)
track_duration = models.IntegerField()
track_number = models.SmallIntegerField()
class Meta:
ordering = ["track_number"]
def __str__(self):
return self.track_title
app_name = 'music'
音乐/urls.py
from django.contrib import admin
from django.urls import path, include, re_path
from . import views
# from blog.views import newsfeed, single
urlpatterns = [
# no info past music return index EG /music/
path('', views.IndexView.as_view(), name='index'),
# re_path(r'^$', views.IndexView.as_view(), name='index'),
# Releases
# albums/releases
re_path(r'^release/$', views.ReleaseView.as_view(), name='release'),
# looking for music page with album id afterwards /music/1
re_path(r'^(?P<pk>[0-9]+)/$', views.DetailView.as_view(), name="detail"),
# Artists
re_path(r'^artistlist.html$', views.ArtistListView.as_view(), name='artistlist'),
re_path(r'^(?P<pk>[0-9]+)/$', views.ArtistView.as_view(), name="artist"),
# Register
# register url
re_path(r'^register/$', views.UserFormView.as_view(), name="register"),
]
# defined the app name in case the same fields are used in other apps
app_name = 'music'
音乐/context_processors.py
from .models import Artist
def all_artists(request):
artist = Artist.objects.all()
return {'artist':artist}
我发现这个 vieo 是完全相同的问题,并尝试将上下文处理器调整为上面的 te,并且还尝试了:
from music.models import Artist:
设置.py
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR, 'templates')]
,
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
'music.context_processors.all_artists',
],
},
},
]
解决方案
您唯一要做的就是将返回键值更改为 all_artists,因为您通过 base.html 中的 all_artists 键获取所有数据,但根据您的代码,在 context_processor.py 的最后一行中没有发现任何 all_artists 发生变化,并且你已准备好出发
音乐/context_processors.py
from .models import Artist
def all_artists(request):
artist = Artist.objects.all()
return {'all_artists':artist}
推荐阅读
- javascript - 使用 assert.doesNotReject 时出现 UnhandledPromiseRejectionWarning
- docker - 使用 Dockerfile 时在属性文件中定义变量的语法是什么?
- reactjs - 有没有办法为所有段落标签呈现自定义反应组件?
- c# - 我的分数如何显示在游戏画面中
- python - BeautifulSoup:将标签(包含其他标签)拆分为两个字符串
- javascript - 网络错误:尝试使用 javascript 在客户端 sode 中下载 csv 文件时
- autohotkey - AutoHotKey AHK 停止和退出脚本和时间变量
- javascript - 如何从没有 json 响应 [Javascript] 的非公共 API 站点(如 instagram)获取数据?
- jquery - 停止 jquery 可拖动 div 走出背景图像
- reactjs - Reactjs this.state.Object 未作为道具传递给功能组件