Model-Templates

Models im Template

  • Liste
    • View erweitern
    • Template erweitern
  • Detailseite
    • Neue View + URL-Mapping
    • Neues Template
    • Verlinkung von Liste

Models in Templates: View Liste

core/views.py

from core.models import Project
def index(request):
   #...
   project_list = Project.objects.all()
   context_dict = {'projects': project_list}
   #...

Template

core/templates/index.html

{% if projects %}
    <ul>
        {% for project in projects %}
           <li>{{ project.name }}</li>
        {% endfor %}
    </ul>
{% else %}
    <strong>Keine Projekte</strong>
{% endif %}

Model Detailseite: View Detail

core/views.py

from django.shortcuts import get_object_or_404
from core.models import Project
from django.template import RequestContext

def project(request, project_id):
    project = get_object_or_404(Project, id=project_id)
    context_dict = {'project': project}
    return render(request, 'project.html', context_dict)

Note

Siehe auch get_list_or_404


Model Detailseite: URL-Mapping

core/urls.py

url(r'^project/(?P<project_id>\d+)/$', views.project, name='project'),)

Note

Weitere Beispiele: * (?P<project_name>w+) * (?P<year>d{4}) * (?P<month>[a-z]{3})


Model Detailseite: Template

core/templates/project.html

<!DOCTYPE html>
<html>
    <head>
        <title>Project</title>
    </head>
    <body>
        <h1>{{ project.name }}</h1>
        <p>{{ project.copy }}</p>
    </body>
</html>

Model URLs Funktion am Model

core/models.py

def get_absolute_url(self):
    from django.core.urlresolvers import reverse
    return reverse('project', args=[str(self.id)])

Note

Um Objekte zu referenzieren, ist es sehr hilfreich, die Objekte um Funktionen zu erweitern wie get_absolute_url.


Verlinkung im Template

<a href="{{ project.get_absolute_url }}">{{ project.name }}</a>

Asset Management

Wir bauen einen einfachen Bildupload


Asset Management 1

Neues Attribut hinzufügen

core/models.py

image = models.ImageField(upload_to='project')

Asset Management 2

Settings Überprüfen

portfolio/settings.py

MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')

Asset Management 3

Template Context Processor setzen für Media damit {{MEDIA_URL}} auch im Template zur Verfügung steht.

portfolio/settings.py

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                ...
                'django.template.context_processors.media',
                ...
            ],
        },
    },
]

Asset Management 4

portfolio/urls.py

from django.conf.urls.static import static
from django.conf import settings

if settings.DEBUG:
    urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

Asset Management 5

Auf der Detailseite das Bild hinzufügen

core/templates/project.html

<img src="{{ MEDIA_URL }}{{ project.image }}">

Übung: Projekt-Kategorien

Kategorieliste mit Projekten darstellen