From 2957f8d75b873e4175ee8ad2db2b1ec01319f59a Mon Sep 17 00:00:00 2001 From: erichhasl Date: Sun, 22 Sep 2019 22:09:23 +0200 Subject: [PATCH 1/5] add ludwigsburgalpin app with initial models --- jdav_web/jdav_web/settings.py | 1 + jdav_web/jdav_web/urls.py | 2 ++ jdav_web/ludwigsburgalpin/__init__.py | 0 jdav_web/ludwigsburgalpin/admin.py | 14 +++++++++++ jdav_web/ludwigsburgalpin/apps.py | 5 ++++ jdav_web/ludwigsburgalpin/models.py | 14 +++++++++++ .../templates/ludwigsburgalpin/termine.html | 21 ++++++++++++++++ jdav_web/ludwigsburgalpin/tests.py | 3 +++ jdav_web/ludwigsburgalpin/urls.py | 9 +++++++ jdav_web/ludwigsburgalpin/views.py | 25 +++++++++++++++++++ 10 files changed, 94 insertions(+) create mode 100644 jdav_web/ludwigsburgalpin/__init__.py create mode 100644 jdav_web/ludwigsburgalpin/admin.py create mode 100644 jdav_web/ludwigsburgalpin/apps.py create mode 100644 jdav_web/ludwigsburgalpin/models.py create mode 100644 jdav_web/ludwigsburgalpin/templates/ludwigsburgalpin/termine.html create mode 100644 jdav_web/ludwigsburgalpin/tests.py create mode 100644 jdav_web/ludwigsburgalpin/urls.py create mode 100644 jdav_web/ludwigsburgalpin/views.py diff --git a/jdav_web/jdav_web/settings.py b/jdav_web/jdav_web/settings.py index 385edaf..9cd3c9b 100644 --- a/jdav_web/jdav_web/settings.py +++ b/jdav_web/jdav_web/settings.py @@ -47,6 +47,7 @@ INSTALLED_APPS = [ 'material.apps.MaterialConfig', 'members.apps.MembersConfig', 'mailer.apps.MailerConfig', + 'ludwigsburgalpin.apps.LudwigsburgalpinConfig', 'easy_select2', 'djcelery_email', 'djcelery', diff --git a/jdav_web/jdav_web/urls.py b/jdav_web/jdav_web/urls.py index 93a0fb6..af40b4d 100644 --- a/jdav_web/jdav_web/urls.py +++ b/jdav_web/jdav_web/urls.py @@ -29,6 +29,8 @@ urlpatterns += i18n_patterns( url(r'^kompass/', admin.site.urls), url(r'^admin/', RedirectView.as_view(url='/kompass')), url(r'^newsletter/', include('mailer.urls', namespace="mailer")), + url(r'^ludwigsburgalpin/', include('ludwigsburgalpin.urls', + namespace="ludwigsburgalpin")), url(r'^$', include('startpage.urls')), ) diff --git a/jdav_web/ludwigsburgalpin/__init__.py b/jdav_web/ludwigsburgalpin/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/jdav_web/ludwigsburgalpin/admin.py b/jdav_web/ludwigsburgalpin/admin.py new file mode 100644 index 0000000..a1c7f6c --- /dev/null +++ b/jdav_web/ludwigsburgalpin/admin.py @@ -0,0 +1,14 @@ +from django.contrib import admin +from .models import Group, Termin + + +class GroupAdmin(admin.ModelAdmin): + list_display = ('name',) + + +class TerminAdmin(admin.ModelAdmin): + list_display = ('title','start_date', 'end_date', 'group') + +# Register your models here. +admin.site.register(Group, GroupAdmin) +admin.site.register(Termin, TerminAdmin) diff --git a/jdav_web/ludwigsburgalpin/apps.py b/jdav_web/ludwigsburgalpin/apps.py new file mode 100644 index 0000000..203b4d9 --- /dev/null +++ b/jdav_web/ludwigsburgalpin/apps.py @@ -0,0 +1,5 @@ +from django.apps import AppConfig + + +class LudwigsburgalpinConfig(AppConfig): + name = 'ludwigsburgalpin' diff --git a/jdav_web/ludwigsburgalpin/models.py b/jdav_web/ludwigsburgalpin/models.py new file mode 100644 index 0000000..5cce047 --- /dev/null +++ b/jdav_web/ludwigsburgalpin/models.py @@ -0,0 +1,14 @@ +from django.db import models + + +class Group(models.Model): + name = models.CharField('Name', max_length=50) + + +# Create your models here. +class Termin(models.Model): + title = models.CharField('Titel', max_length=100) + start_date = models.DateField('Von') + end_date = models.DateField('Bis') + group = models.ForeignKey('ludwigsburgalpin.Group', + verbose_name='Gruppe') diff --git a/jdav_web/ludwigsburgalpin/templates/ludwigsburgalpin/termine.html b/jdav_web/ludwigsburgalpin/templates/ludwigsburgalpin/termine.html new file mode 100644 index 0000000..4f987b1 --- /dev/null +++ b/jdav_web/ludwigsburgalpin/templates/ludwigsburgalpin/termine.html @@ -0,0 +1,21 @@ +{% load i18n %} + + + + Ludwigsburg Alpin Terminverwaltung + + + +

Hier kannst Du Deinen Termin eintragen, pass bitte auf, weil danach kannst Du ihn nicht mehr ändern

+ +{% if error_message %} +

{{ error_message }}

+{% endif %} + +
+ + {% csrf_token %} + {{ form }} + +
+
diff --git a/jdav_web/ludwigsburgalpin/tests.py b/jdav_web/ludwigsburgalpin/tests.py new file mode 100644 index 0000000..7ce503c --- /dev/null +++ b/jdav_web/ludwigsburgalpin/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/jdav_web/ludwigsburgalpin/urls.py b/jdav_web/ludwigsburgalpin/urls.py new file mode 100644 index 0000000..6ff1be7 --- /dev/null +++ b/jdav_web/ludwigsburgalpin/urls.py @@ -0,0 +1,9 @@ +from django.conf.urls import url + +from . import views + +app_name = "ludwigsburgalpin" +urlpatterns = [ + url(r'^$', views.index, name='index') + # url(r'^subscribe', views.subscribe, name='subscribe'), +] diff --git a/jdav_web/ludwigsburgalpin/views.py b/jdav_web/ludwigsburgalpin/views.py new file mode 100644 index 0000000..f75c1e6 --- /dev/null +++ b/jdav_web/ludwigsburgalpin/views.py @@ -0,0 +1,25 @@ +from django.shortcuts import render +from django import forms +from django.http import HttpResponseRedirect + +class TerminForm(forms.Form): + title = forms.CharField(label='Termin') + start_date = forms.DateField(widget=forms.SelectDateWidget(), + label='Von') + end_date = forms.DateField(widget=forms.SelectDateWidget(), + label='Bis') + group = forms.ChoiceField(label='Gruppe', + choices=[('Jugend', 'Jugend'), + ('ASG', 'ASG'), + ('Ü50-Gruppe', 'Ü50-Gruppe')]) + + +# Create your views here. +def index(request): + if request.method == 'POST': + form = TerminForm(request.POST) + if form.is_valid(): + return HttpResponseRedirect('/') + else: + form = TerminForm() + return render(request, 'ludwigsburgalpin/termine.html', {'form': form.as_table()}) From 541f7cc0804923feafb674e427bc7418952c63c8 Mon Sep 17 00:00:00 2001 From: erichhasl Date: Sun, 22 Sep 2019 22:34:36 +0200 Subject: [PATCH 2/5] include basic functionality --- jdav_web/ludwigsburgalpin/models.py | 14 ++++++++++++++ .../templates/ludwigsburgalpin/published.html | 3 +++ jdav_web/ludwigsburgalpin/views.py | 19 ++++++++++++++----- 3 files changed, 31 insertions(+), 5 deletions(-) create mode 100644 jdav_web/ludwigsburgalpin/templates/ludwigsburgalpin/published.html diff --git a/jdav_web/ludwigsburgalpin/models.py b/jdav_web/ludwigsburgalpin/models.py index 5cce047..6dcbfd8 100644 --- a/jdav_web/ludwigsburgalpin/models.py +++ b/jdav_web/ludwigsburgalpin/models.py @@ -4,6 +4,13 @@ from django.db import models class Group(models.Model): name = models.CharField('Name', max_length=50) + class Meta: + verbose_name = 'Gruppe' + verbose_name_plural = 'Gruppen' + + def __str__(self): + return self.name + # Create your models here. class Termin(models.Model): @@ -12,3 +19,10 @@ class Termin(models.Model): end_date = models.DateField('Bis') group = models.ForeignKey('ludwigsburgalpin.Group', verbose_name='Gruppe') + + def __str__(self): + return "{} {}".format(self.title, str(self.group)) + + class Meta: + verbose_name = 'Termin' + verbose_name_plural = 'Termine' diff --git a/jdav_web/ludwigsburgalpin/templates/ludwigsburgalpin/published.html b/jdav_web/ludwigsburgalpin/templates/ludwigsburgalpin/published.html new file mode 100644 index 0000000..d757994 --- /dev/null +++ b/jdav_web/ludwigsburgalpin/templates/ludwigsburgalpin/published.html @@ -0,0 +1,3 @@ +

Termin erfolgreich eingereicht

+ +

Hier kannst du einen neuen Termin hinzufügen.

diff --git a/jdav_web/ludwigsburgalpin/views.py b/jdav_web/ludwigsburgalpin/views.py index f75c1e6..14e6336 100644 --- a/jdav_web/ludwigsburgalpin/views.py +++ b/jdav_web/ludwigsburgalpin/views.py @@ -1,6 +1,8 @@ from django.shortcuts import render from django import forms from django.http import HttpResponseRedirect +from .models import Group, Termin + class TerminForm(forms.Form): title = forms.CharField(label='Termin') @@ -8,10 +10,8 @@ class TerminForm(forms.Form): label='Von') end_date = forms.DateField(widget=forms.SelectDateWidget(), label='Bis') - group = forms.ChoiceField(label='Gruppe', - choices=[('Jugend', 'Jugend'), - ('ASG', 'ASG'), - ('Ü50-Gruppe', 'Ü50-Gruppe')]) + group = forms.ModelChoiceField(label='Gruppe', + queryset=Group.objects.all()) # Create your views here. @@ -19,7 +19,16 @@ def index(request): if request.method == 'POST': form = TerminForm(request.POST) if form.is_valid(): - return HttpResponseRedirect('/') + termin = Termin(title=form.cleaned_data["title"], + start_date=form.cleaned_data["start_date"], + end_date=form.cleaned_data["end_date"], + group=form.cleaned_data["group"]) + termin.save() + return published(request) else: form = TerminForm() return render(request, 'ludwigsburgalpin/termine.html', {'form': form.as_table()}) + + +def published(request): + return render(request, 'ludwigsburgalpin/published.html') From fa50517e8810cb38d2d12e761a8b4b6a530b1982 Mon Sep 17 00:00:00 2001 From: erichhasl Date: Mon, 23 Sep 2019 11:43:13 +0200 Subject: [PATCH 3/5] add excel export option --- jdav_web/ludwigsburgalpin/admin.py | 37 ++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/jdav_web/ludwigsburgalpin/admin.py b/jdav_web/ludwigsburgalpin/admin.py index a1c7f6c..7237265 100644 --- a/jdav_web/ludwigsburgalpin/admin.py +++ b/jdav_web/ludwigsburgalpin/admin.py @@ -1,6 +1,13 @@ +import os + from django.contrib import admin +from wsgiref.util import FileWrapper +from django.http import HttpResponse +from django.conf import settings from .models import Group, Termin +import xlsxwriter + class GroupAdmin(admin.ModelAdmin): list_display = ('name',) @@ -8,7 +15,37 @@ class GroupAdmin(admin.ModelAdmin): class TerminAdmin(admin.ModelAdmin): list_display = ('title','start_date', 'end_date', 'group') + list_filter = ('group',) + ordering = ('start_date','end_date') + actions = ['make_overview'] + + def make_overview(self, request, queryset): + filename = 'termine.xlsx' + workbook = xlsxwriter.Workbook(media_path(filename)) + bold = workbook.add_format({'bold': True}) + worksheet = workbook.add_worksheet() + worksheet.write(0, 0, "Titel", bold) + worksheet.write(0, 1, "Von", bold) + worksheet.write(0, 2, "Bis", bold) + worksheet.write(0, 3, "Gruppe", bold) + for row, termin in enumerate(queryset): + worksheet.write(row+2, 0, termin.title) + worksheet.write(row+2, 1, termin.start_date.strftime('%d.%m.%Y')) + worksheet.write(row+2, 2, termin.end_date.strftime('%d.%m.%Y')) + worksheet.write(row+2, 3, str(termin.group)) + workbook.close() + with open(media_path(filename), 'rb') as xls: + response = HttpResponse(FileWrapper(xls)) + response['Content-Type'] = 'application/xlsx' + response['Content-Disposition'] = 'attachment; filename='+filename + + return response + make_overview.short_description = "Termine in Excel Liste überführen" # Register your models here. admin.site.register(Group, GroupAdmin) admin.site.register(Termin, TerminAdmin) + + +def media_path(fp): + return os.path.join(os.path.join(settings.MEDIA_MEMBERLISTS, "memberlists"), fp) From 75efe45d1faf8280b3420c32e8fa866b3a307a54 Mon Sep 17 00:00:00 2001 From: erichhasl Date: Mon, 23 Sep 2019 11:43:37 +0200 Subject: [PATCH 4/5] add proper datepicker --- .../templates/ludwigsburgalpin/termine.html | 10 ++++++++++ jdav_web/ludwigsburgalpin/views.py | 13 +++++++++---- 2 files changed, 19 insertions(+), 4 deletions(-) diff --git a/jdav_web/ludwigsburgalpin/templates/ludwigsburgalpin/termine.html b/jdav_web/ludwigsburgalpin/templates/ludwigsburgalpin/termine.html index 4f987b1..45a1efe 100644 --- a/jdav_web/ludwigsburgalpin/templates/ludwigsburgalpin/termine.html +++ b/jdav_web/ludwigsburgalpin/templates/ludwigsburgalpin/termine.html @@ -4,6 +4,16 @@ Ludwigsburg Alpin Terminverwaltung + + + +

Hier kannst Du Deinen Termin eintragen, pass bitte auf, weil danach kannst Du ihn nicht mehr ändern

diff --git a/jdav_web/ludwigsburgalpin/views.py b/jdav_web/ludwigsburgalpin/views.py index 14e6336..fae4527 100644 --- a/jdav_web/ludwigsburgalpin/views.py +++ b/jdav_web/ludwigsburgalpin/views.py @@ -1,15 +1,20 @@ from django.shortcuts import render from django import forms from django.http import HttpResponseRedirect +from django.contrib.admin import widgets from .models import Group, Termin +from bootstrap_datepicker.widgets import DatePicker + +datepicker = forms.TextInput(attrs={'class': 'datepicker'}) + class TerminForm(forms.Form): title = forms.CharField(label='Termin') - start_date = forms.DateField(widget=forms.SelectDateWidget(), - label='Von') - end_date = forms.DateField(widget=forms.SelectDateWidget(), - label='Bis') + start_date = forms.DateField(label='Von', + widget=datepicker) + end_date = forms.DateField(label='Bis', + widget=datepicker) group = forms.ModelChoiceField(label='Gruppe', queryset=Group.objects.all()) From 5997e719c2a394d2e29b0bf0bb4528e6451bd112 Mon Sep 17 00:00:00 2001 From: erichhasl Date: Mon, 23 Sep 2019 20:09:04 +0200 Subject: [PATCH 5/5] improve styling, adapt to style of dav website --- .../static/ludwigsburgalpin/base.css | 132 ++++++++++++++++++ .../static/ludwigsburgalpin/img/favicon.ico | Bin 0 -> 894 bytes .../static/ludwigsburgalpin/img/logo_dav.png | Bin 0 -> 12246 bytes .../static/ludwigsburgalpin/termine.css | 9 ++ .../templates/ludwigsburgalpin/base.html | 47 +++++++ .../templates/ludwigsburgalpin/published.html | 4 + .../templates/ludwigsburgalpin/termine.html | 34 ++--- jdav_web/ludwigsburgalpin/views.py | 2 +- 8 files changed, 207 insertions(+), 21 deletions(-) create mode 100644 jdav_web/ludwigsburgalpin/static/ludwigsburgalpin/base.css create mode 100644 jdav_web/ludwigsburgalpin/static/ludwigsburgalpin/img/favicon.ico create mode 100644 jdav_web/ludwigsburgalpin/static/ludwigsburgalpin/img/logo_dav.png create mode 100644 jdav_web/ludwigsburgalpin/static/ludwigsburgalpin/termine.css create mode 100644 jdav_web/ludwigsburgalpin/templates/ludwigsburgalpin/base.html diff --git a/jdav_web/ludwigsburgalpin/static/ludwigsburgalpin/base.css b/jdav_web/ludwigsburgalpin/static/ludwigsburgalpin/base.css new file mode 100644 index 0000000..2e7fcc4 --- /dev/null +++ b/jdav_web/ludwigsburgalpin/static/ludwigsburgalpin/base.css @@ -0,0 +1,132 @@ +body,html{ + font-size: 16px; + line-height: 29px; + color:#0c1a30; + font-family: "Helvetica Neue Light", "HelveticaNeue-Light", "Helvetica Neue", Calibri, Helvetica, Arial; + margin: 0; +} + +#content { + width: 80%; + margin: 0 auto; + overflow:hidden; + position: relative; +} + +h1 { + font-size: 22px; +} + +h2{ + font-size: 22px; +} + +h3 a:link, h3 a:visited, h2 a:link, h2 a:visited { + color: #58ab27; +} + +h3 { + font-size: 19px; +} + +h4 { + font-size: 17px; +} + +h1,h2,h3,h4{ + color: #58ab27; + font-weight: normal; + text-shadow: #fff 0px 1px 1px; + letter-spacing:0.1em; +} + +a { + color: #58ab27; + text-decoration: none; + outline: 0; +} + +a:hover, a:focus { + color: #386d19; + text-decoration: none; + outline: 0; +} + +div.navbar-header { + width: 83%; + margin: 0 auto; + overflow:hidden; + position: relative; +} + +ul.navbar { + float: right; + list-style-type: none; + margin: 0; + padding: 0; + overflow: hidden; +} + +.navbar > li { + float: left; + position: relative; + display: block; +} + +a.navbar-brand { + line-height: 120px; + display: inline-block; + height: 120px; + opacity: 1; + padding: 23px 23px; + transition: opacity 0.15s linear; +} + +a.navbar-brand:hover { + opacity: 0.8; + transition: opacity 0.15s linear; +} + +.navbar > li a { + display: inline-block; + color: #777777; + text-align: center; + text-transform: uppercase; + padding: 16px; + line-height: 120px; +} + +.navbar > li a:hover { + color: #333333; +} + +.navbar > li a:before { + content: ""; + position: absolute; + width: 100%; + height: 5px; + top: 0; + left: 0; + background-color: #58ab27; + visibility: hidden; + opacity: 0; + transition: opacity 0.3s linear; +} + +.navbar > li a:hover:before { + visibility: visible; + opacity: 0.5; + transition: opacity 0.3s linear; +} + +.navbar > li.current a:before { + content: ""; + position: absolute; + width: 100%; + height: 5px; + top: 0; + left: 0; + background-color: #58ab27; + visibility: visible; + opacity: 1; +} diff --git a/jdav_web/ludwigsburgalpin/static/ludwigsburgalpin/img/favicon.ico b/jdav_web/ludwigsburgalpin/static/ludwigsburgalpin/img/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..df58720de39c765fa6b81246140e407d073be89c GIT binary patch literal 894 zcmah|O=uHA7@gw5i-(@XV@1#^VzmcFD+pf1oAqNvGA{J&hyV;%D>`!*}B@0Wah0gA`ym{aI=6gG{OGpc@ z)>eYCi`>{o$WEYkM4f6ww19663E^QY2S?;Db zQ>rP@53tX=X9s@r_U~)z8{hUtW#W!D=ciyk%=1|MkQD1tCuhwc;9pf&(X@>YAC-jT zvhaj0-qW&ip6_GtBYf$EEObiG&Xiwt$w@Sd^8B<}Sg_VAu7R!VE~gq+qnMtQpU;}b zQ}XC}<)z;a<|UU0uEwh0d(_u>qQv(GfFr}R=qQ0K0JX*rhxsxDeR}S)Itd^c;`K^8 zX?zW28^Bd{>WCD@L9aOU01czc^1Myg_Y3i{4YEZa!`mJjY4*HfaZK;(b9nK9$0>{U rpI{1L{UyZABDx4!!~ao_N8szR02~Sd)W;6wwiB|BFcH=uLL}rL@^oLa literal 0 HcmV?d00001 diff --git a/jdav_web/ludwigsburgalpin/static/ludwigsburgalpin/img/logo_dav.png b/jdav_web/ludwigsburgalpin/static/ludwigsburgalpin/img/logo_dav.png new file mode 100644 index 0000000000000000000000000000000000000000..893d9cc966f2e83f66cd7dcf375b1a8fcc739aa8 GIT binary patch literal 12246 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%0A_=}Wc<<-SKcslWy4#`wv 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 P_5dY0HQ9P;^RWL1xG#sh literal 0 HcmV?d00001 diff --git a/jdav_web/ludwigsburgalpin/static/ludwigsburgalpin/termine.css b/jdav_web/ludwigsburgalpin/static/ludwigsburgalpin/termine.css new file mode 100644 index 0000000..4783592 --- /dev/null +++ b/jdav_web/ludwigsburgalpin/static/ludwigsburgalpin/termine.css @@ -0,0 +1,9 @@ +table.termine { + text-align: left; +} + +td { + padding-left: 50px; + display: block; + float: left; +} diff --git a/jdav_web/ludwigsburgalpin/templates/ludwigsburgalpin/base.html b/jdav_web/ludwigsburgalpin/templates/ludwigsburgalpin/base.html new file mode 100644 index 0000000..4b6d484 --- /dev/null +++ b/jdav_web/ludwigsburgalpin/templates/ludwigsburgalpin/base.html @@ -0,0 +1,47 @@ +{% load i18n %} +{% load static %} + + + + + Ludwigsburg Alpin Terminverwaltung + + + + + + + + + + + + + +
+ + {% block content %} + {% endblock %} + +
+ + + + diff --git a/jdav_web/ludwigsburgalpin/templates/ludwigsburgalpin/published.html b/jdav_web/ludwigsburgalpin/templates/ludwigsburgalpin/published.html index d757994..ac9152e 100644 --- a/jdav_web/ludwigsburgalpin/templates/ludwigsburgalpin/published.html +++ b/jdav_web/ludwigsburgalpin/templates/ludwigsburgalpin/published.html @@ -1,3 +1,7 @@ +{% extends "ludwigsburgalpin/base.html" %} + +{% block content %}

Termin erfolgreich eingereicht

Hier kannst du einen neuen Termin hinzufügen.

+{% endblock %} diff --git a/jdav_web/ludwigsburgalpin/templates/ludwigsburgalpin/termine.html b/jdav_web/ludwigsburgalpin/templates/ludwigsburgalpin/termine.html index 45a1efe..24008dd 100644 --- a/jdav_web/ludwigsburgalpin/templates/ludwigsburgalpin/termine.html +++ b/jdav_web/ludwigsburgalpin/templates/ludwigsburgalpin/termine.html @@ -1,31 +1,25 @@ +{% extends "ludwigsburgalpin/base.html" %} {% load i18n %} +{% load static %} - - - Ludwigsburg Alpin Terminverwaltung - - - - - - +{% block content %} -

Hier kannst Du Deinen Termin eintragen, pass bitte auf, weil danach kannst Du ihn nicht mehr ändern

+ + +

Ludwigsburg Alpin Termine

+ +

Hier kannst du einen Termin für deine Gruppe hinzufügen

{% if error_message %} -

{{ error_message }}

+

{{ error_message }}

{% endif %}
- - {% csrf_token %} +
+ {% csrf_token %} {{ form }} -
+

+ +{% endblock %} diff --git a/jdav_web/ludwigsburgalpin/views.py b/jdav_web/ludwigsburgalpin/views.py index fae4527..93f19ca 100644 --- a/jdav_web/ludwigsburgalpin/views.py +++ b/jdav_web/ludwigsburgalpin/views.py @@ -10,7 +10,7 @@ datepicker = forms.TextInput(attrs={'class': 'datepicker'}) class TerminForm(forms.Form): - title = forms.CharField(label='Termin') + title = forms.CharField(label='Titel') start_date = forms.DateField(label='Von', widget=datepicker) end_date = forms.DateField(label='Bis',