首页 > 解决方案 > 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',
            ],
        },
    },
]

标签: pythondjangoroutes

解决方案


您唯一要做的就是将返回键值更改为 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}

推荐阅读