Django3 - проблема с заполнением данных SQlite DB элемента Navbar с помощью контекстных процессоров. - PullRequest
0 голосов
/ 03 августа 2020

У меня есть веб-сайт звукозаписывающей компании, который я создаю, и я хочу заполнить раскрывающийся список на панели навигации исполнителями из объекта Artst Artist.objects.all ().

Я работаю в одном приложении "musi *" 1033 * "но только когда я добавляю" / artistlist / "в конец. Любой другой URL-адрес не заполняет список.

Я хочу, чтобы список всегда присутствовал как элемент панели навигации. На данный момент я пытаюсь заставить работать context_processors.py. YouTube-учебник, за которым я следую по точно такой же проблеме

Мне нужна помощь, так как я явно делаю что-то глупое или что-то упустил из виду c. На всех остальных URL-адресах это вызывает еще одно: «В настоящее время у нас еще нет художников ...».

Надеюсь, это имеет смысл для кого-то. Приветствуется любая помощь.

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>

main urls.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)

music / models.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'

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'

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:

settings.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',
            ],
        },
    },
]

1 Ответ

2 голосов
/ 06 августа 2020

единственное, что вы хотите сделать, это изменить значение возвращаемого ключа на all_artists, потому что вы получаете все данные с помощью ключа all_artists в своей базе. html но согласно вашему коду не найдено ни одного all_artists, измените в последней строке в context_processor.py, и вы можете go

music / context_processors.py

from .models import Artist

def all_artists(request):
    artist = Artist.objects.all()
    return {'all_artists':artist}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...