Keegan
Keegan

Reputation: 1

How can I get my html to display my django model?

I'm trying to get my django model to be shown in the footer of my base.html but I can't get it to show up. I've looked at a few videos and I can't figure out where I'm going wrong. I know that the model works as I've made 4 entries in my database and I can view them on the admin page. The code also doesn't show any errors so I have nothing to go off of there. Here it is:

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, 'base.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.name }}">
        <i class="{{ smlink.font_awesome_class }}">
    </a>
{% endfor %}

Upvotes: 0

Views: 95

Answers (2)

Maxim Danilov
Maxim Danilov

Reputation: 3350

in your view you use:

return render(request, 'index.html', context)

i can not see, if you are defined index.html Somethere in index you should have

{% extends base.htm %}

The second, i am agree with @Shabble:

{% for smlink in smbase %}
    <a href="{{ smlink.name }}">
        <i class="{{ smlink.font_awesome_class }}">
    </a>
{% endfor %}

The last: Try to use Django-GCBV TemplateView. Or ListView, in your case it is better:

somethere in views.py

Class MyListView(ListView):
    model = SocialMediaPlatform
    template_name = index.html

somethere in urls.py

urlpatterns = [
    path('', MyListView.as_view()),
]

somethere in index.html

{% for smlink in object_list %}
    <a href="{{ smlink.name }}">
        <i class="{{ smlink.font_awesome_class }}">
    </a>
{% endfor %}

Upvotes: 0

NixonSparrow
NixonSparrow

Reputation: 6368

Look what you are passing as context:

def social_media_base_view(request):
    ...
    smbase = SocialMediaPlatform.objects.all()
    context['smbase'] = smbase
    return ...

It's QuerySet of SocialMediaPlatform objects. It means, that you can render them one by one with for loop:

{% for smlink in smbase %}
    {{ smlink.name }}
{% endfor %}

You don't need to call SocialMediaPlatform model additionaly.

Upvotes: 1

Related Questions