Как я могу заставить мой html отображать мою модель django?
Я пытаюсь заставить мою модель django отображаться в нижнем колонтитуле моего base.html, но я не могу заставить ее отображаться. Я просмотрел несколько видео и не могу понять, где я ошибаюсь. Я знаю, что модель работает, так как я сделал 4 записи в своей базе данных и могу просмотреть их на странице администратора. Код также не показывает никаких ошибок, так что мне не на что ориентироваться. Вот он:
Models.py
class SocialMediaPlatform(models.Model):
name = models.CharField(max_length=50, blank=True, null=True)
font_awesome_class = models.CharField(max_length=50, blank=True, null=True)
base_url = models.CharField(max_length=50, blank=True, null=True,
default='https://instagram.com/ or https://tiktok.com/@')
def __str__(self):
return self.base_url
Views.py
def social_media_base_view(request):
context = {}
smbase = SocialMediaPlatform.objects.all()
context['smbase'] = smbase
return render(request, 'index.html', context)
Urls.py
urlpatterns = [
path('', views.social_media_base_view),
]
Admin.py
@admin.register(SocialMediaPlatform)
class SocialPlatformAdmin(admin.ModelAdmin):
list_display = ('name', 'font_awesome_class', 'base_url')
base.html
{% for smlink in smbase %}
<a href="{{ smlink.SocialMediaPlatform.name }}">
<i class="{{ smlink.SocialMediaPlatform.font_awesome_class }}">
</a>
{% endfor %}
Посмотрите, что вы передаете в качестве контекста:
def social_media_base_view(request):
...
smbase = SocialMediaPlatform.objects.all()
context['smbase'] = smbase
return ...
Это QuerySet
из SocialMediaPlatform
объектов. Это означает, что вы можете рендерить их по одному с помощью цикла for
:
{% for smlink in smbase %}
{{ smlink.name }}
{% endfor %}
Вам не нужно вызывать SocialMediaPlatform
модель дополнительно.
В вашем представлении вы используете:
return render(request, 'index.html', context)
я не могу понять, определены ли вы index.html
.
Где-то в индексе у вас должно быть
{% extends base.htm %}
Во-вторых, я согласен с @Shabble:
{% for smlink in smbase %}
<a href="{{ smlink.name }}">
<i class="{{ smlink.font_awesome_class }}">
</a>
{% endfor %}
Последнее:
Попробуйте использовать Django-GCBV TemplateView
. Или ListView
, в вашем случае это лучше:
somethere in views.py
Class MyListView(ListView):
model = SocialMediaPlatform
template_name = index.html
somethere in urls.py
urlpatterns = [
path('', MyListView.as_view()),
]
сомета в index.html
{% for smlink in object_list %}
<a href="{{ smlink.name }}">
<i class="{{ smlink.font_awesome_class }}">
</a>
{% endfor %}