Eingabefelder werden dynamisch aus dem Model/Form erzeugt.

master
Ulf Wagner 2 years ago
parent 355ea34e03
commit a26752044b
  1. 21
      UGSdjangoProject/.idea/dataSources.xml
  2. 123
      UGSdjangoProject/.idea/dbnavigator.xml
  3. 6
      UGSdjangoProject/.idea/sqldialects.xml
  4. 19
      UGSdjangoProject/UGSdjangoProject/settings.py
  5. 58
      UGSdjangoProject/ugssim/form.py
  6. 17
      UGSdjangoProject/ugssim/migrations/0001_initial.py
  7. 4
      UGSdjangoProject/ugssim/models.py
  8. 1
      UGSdjangoProject/ugssim/templates/planungsparameter/companydata.html
  9. 22
      UGSdjangoProject/ugssim/templates/planungsparameter/mandantendaten.html
  10. 64
      UGSdjangoProject/ugssim/templates/planungsparameter/planungsparameter.html
  11. 5
      UGSdjangoProject/ugssim/templates/planungsparameter/summary.html
  12. 5
      UGSdjangoProject/ugssim/templates/ugssim/ugssim.html
  13. 0
      UGSdjangoProject/ugssim/templatetags/__init__.py
  14. 28
      UGSdjangoProject/ugssim/templatetags/read_dictonary.py
  15. 71
      UGSdjangoProject/ugssim/views.py

@ -0,0 +1,21 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="DataSourceManagerImpl" format="xml" multifile-model="true">
<data-source source="LOCAL" name="Django default" uuid="204bda06-bee8-47b6-b9ad-2440fd487d22">
<driver-ref>sqlite.xerial</driver-ref>
<synchronize>true</synchronize>
<imported>true</imported>
<remarks>$PROJECT_DIR$/UGSdjangoProject/settings.py</remarks>
<jdbc-driver>org.sqlite.JDBC</jdbc-driver>
<jdbc-url>jdbc:sqlite:C:\Users\Ulf Wagner\PycharmProjects\UGSdjangoProject\db.sqlite3</jdbc-url>
<working-dir>$ProjectFileDir$</working-dir>
</data-source>
<data-source source="LOCAL" name="ugssim@localhost" uuid="151fe7b4-8b3e-40f4-aa7e-b0087d782bb2">
<driver-ref>mariadb</driver-ref>
<synchronize>true</synchronize>
<jdbc-driver>org.mariadb.jdbc.Driver</jdbc-driver>
<jdbc-url>jdbc:mariadb://localhost:3306/ugssim</jdbc-url>
<working-dir>$ProjectFileDir$</working-dir>
</data-source>
</component>
</project>

@ -1,16 +1,135 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<project version="4"> <project version="4">
<component name="DBNavigator.Project.DataEditorManager">
<record-view-column-sorting-type value="BY_INDEX" />
<value-preview-text-wrapping value="true" />
<value-preview-pinned value="false" />
</component>
<component name="DBNavigator.Project.DatabaseBrowserManager"> <component name="DBNavigator.Project.DatabaseBrowserManager">
<autoscroll-to-editor value="false" /> <autoscroll-to-editor value="false" />
<autoscroll-from-editor value="true" /> <autoscroll-from-editor value="true" />
<show-object-properties value="true" /> <show-object-properties value="true" />
<loaded-nodes /> <loaded-nodes />
</component> </component>
<component name="DBNavigator.Project.DatabaseConsoleManager">
<connection id="0f0466f7-0c21-4ba2-a1e8-70c7298d934b">
<console name="Connection" type="STANDARD" schema="" session="Main" />
</connection>
</component>
<component name="DBNavigator.Project.DatabaseEditorStateManager">
<last-used-providers />
</component>
<component name="DBNavigator.Project.DatabaseFileManager"> <component name="DBNavigator.Project.DatabaseFileManager">
<open-files /> <open-files>
<object connection-id="0f0466f7-0c21-4ba2-a1e8-70c7298d934b" object-ref="consoles/Connection" />
</open-files>
</component>
<component name="DBNavigator.Project.DatabaseSessionManager">
<connection id="0f0466f7-0c21-4ba2-a1e8-70c7298d934b" />
</component>
<component name="DBNavigator.Project.ObjectQuickFilterManager">
<last-used-operator value="EQUAL" />
<filters />
</component> </component>
<component name="DBNavigator.Project.Settings"> <component name="DBNavigator.Project.Settings">
<connections /> <connections>
<connection id="0f0466f7-0c21-4ba2-a1e8-70c7298d934b" active="true" signed="true">
<database>
<name value="Connection" />
<description value="" />
<database-type value="SQLITE" />
<config-type value="BASIC" />
<database-version value="9999.0" />
<driver-source value="BUNDLED" />
<driver-library value="" />
<driver value="" />
<url-type value="FILE" />
<host value="" />
<port value="" />
<database value="" />
<tns-folder value="" />
<tns-profile value="" />
<files>
<file path="sqlite.db" schema="main" />
</files>
<type value="NONE" />
<user value="" />
<deprecated-pwd value="" />
</database>
<properties>
<auto-commit value="false" />
</properties>
<ssh-settings>
<active value="false" />
<proxy-host value="" />
<proxy-port value="22" />
<proxy-user value="" />
<deprecated-proxy-pwd value="" />
<auth-type value="PASSWORD" />
<key-file value="" />
<key-passphrase value="" />
</ssh-settings>
<ssl-settings>
<active value="false" />
<certificate-authority-file value="" />
<client-certificate-file value="" />
<client-key-file value="" />
</ssl-settings>
<details>
<charset value="UTF-8" />
<session-management value="true" />
<ddl-file-binding value="true" />
<database-logging value="true" />
<connect-automatically value="true" />
<restore-workspace value="true" />
<restore-workspace-deep value="false" />
<environment-type value="default" />
<connectivity-timeout value="30" />
<idle-time-to-disconnect value="30" />
<idle-time-to-disconnect-pool value="5" />
<credential-expiry-time value="10" />
<max-connection-pool-size value="7" />
<alternative-statement-delimiter value="" />
</details>
<debugger>
<compile-dependencies value="true" />
<tcp-driver-tunneling value="false" />
<tcp-host-address value="" />
<tcp-port-from value="4000" />
<tcp-port-to value="4999" />
</debugger>
<object-filters hide-empty-schemas="false" hide-pseudo-columns="false" hide-audit-columns="false">
<object-type-filter>
<object-type name="SCHEMA" enabled="true" />
<object-type name="USER" enabled="true" />
<object-type name="ROLE" enabled="true" />
<object-type name="PRIVILEGE" enabled="true" />
<object-type name="CHARSET" enabled="true" />
<object-type name="TABLE" enabled="true" />
<object-type name="VIEW" enabled="true" />
<object-type name="MATERIALIZED_VIEW" enabled="true" />
<object-type name="NESTED_TABLE" enabled="true" />
<object-type name="COLUMN" enabled="true" />
<object-type name="INDEX" enabled="true" />
<object-type name="CONSTRAINT" enabled="true" />
<object-type name="DATASET_TRIGGER" enabled="true" />
<object-type name="DATABASE_TRIGGER" enabled="true" />
<object-type name="SYNONYM" enabled="true" />
<object-type name="SEQUENCE" enabled="true" />
<object-type name="PROCEDURE" enabled="true" />
<object-type name="FUNCTION" enabled="true" />
<object-type name="PACKAGE" enabled="true" />
<object-type name="TYPE" enabled="true" />
<object-type name="TYPE_ATTRIBUTE" enabled="true" />
<object-type name="ARGUMENT" enabled="true" />
<object-type name="DIMENSION" enabled="true" />
<object-type name="CLUSTER" enabled="true" />
<object-type name="DBLINK" enabled="true" />
</object-type-filter>
<object-name-filters />
</object-filters>
</connection>
</connections>
<browser-settings> <browser-settings>
<general> <general>
<display-mode value="TABBED" /> <display-mode value="TABBED" />

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="SqlDialectMappings">
<file url="PROJECT" dialect="SQLite" />
</component>
</project>

@ -15,7 +15,6 @@ from pathlib import Path
# Build paths inside the project like this: BASE_DIR / 'subdir'. # Build paths inside the project like this: BASE_DIR / 'subdir'.
BASE_DIR = Path(__file__).resolve().parent.parent BASE_DIR = Path(__file__).resolve().parent.parent
# Quick-start development settings - unsuitable for production # Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/5.0/howto/deployment/checklist/ # See https://docs.djangoproject.com/en/5.0/howto/deployment/checklist/
@ -27,7 +26,6 @@ DEBUG = True
ALLOWED_HOSTS = [] ALLOWED_HOSTS = []
# Application definition # Application definition
INSTALLED_APPS = [ INSTALLED_APPS = [
@ -71,18 +69,20 @@ TEMPLATES = [
WSGI_APPLICATION = 'UGSdjangoProject.wsgi.application' WSGI_APPLICATION = 'UGSdjangoProject.wsgi.application'
# Database # Database
# https://docs.djangoproject.com/en/5.0/ref/settings/#databases # https://docs.djangoproject.com/en/5.0/ref/settings/#databases
DATABASES = { DATABASES = {
'default': { 'default': {
'ENGINE': 'django.db.backends.sqlite3', 'ENGINE': 'django.db.backends.mysql',
'NAME': BASE_DIR / 'db.sqlite3', 'NAME': 'ugssim',
'USER': 'ugssimuser',
'PASSWORD': 'Tradition2-Ransack-Retrial',
'HOST': 'localhost',
'PORT': '3306',
} }
} }
# Password validation # Password validation
# https://docs.djangoproject.com/en/5.0/ref/settings/#auth-password-validators # https://docs.djangoproject.com/en/5.0/ref/settings/#auth-password-validators
@ -101,11 +101,10 @@ AUTH_PASSWORD_VALIDATORS = [
}, },
] ]
# Internationalization # Internationalization
# https://docs.djangoproject.com/en/5.0/topics/i18n/ # https://docs.djangoproject.com/en/5.0/topics/i18n/
LANGUAGE_CODE = 'de-de' LANGUAGE_CODE = 'de'
TIME_ZONE = 'UTC' TIME_ZONE = 'UTC'
@ -113,7 +112,6 @@ USE_I18N = True
USE_TZ = True USE_TZ = True
# Static files (CSS, JavaScript, Images) # Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/5.0/howto/static-files/ # https://docs.djangoproject.com/en/5.0/howto/static-files/
@ -126,4 +124,5 @@ DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'
STATICFILES_DIRS = [os.path.join(BASE_DIR, "static")] STATICFILES_DIRS = [os.path.join(BASE_DIR, "static")]
#DATE_INPUT_FORMATS = ['%d-%m-%Y'] DATE_FORMAT = '%Y-%m-%d'
DATE_INPUT_FORMATS = '%Y-%m-%d'

@ -1,42 +1,46 @@
from django import forms from django import forms
from django.forms import DateInput from django.forms import DateInput
from .models import * from ugssim.models import *
from ugssim.models import Address
from django import forms from django import forms
''''
class AddressForm(forms.Form): class UGSModelForm(forms.ModelForm):
vorname = forms.CharField(max_length=255) def __init__(self, *args, **kwargs):
nachname = forms.CharField(max_length=255) super(forms.ModelForm, self).__init__(*args, **kwargs)
geburtstag = forms.DateField(widget=forms.SelectDateWidget) # 'description should be the first field
street = forms.CharField(max_length=255) # value = self.fields.pop('description')
hausnummer = forms.CharField(max_length=10) # copy = self.fields.copy()
postleitzahl = forms.CharField(max_length=5) # new_pos = self.fields.keyOrder.index('b')
# self.fields = {'description': value}
''' # self.fields.update(copy)
# set 'form-control' as standard calls
for name, field in self.fields.items():
# if field.widget.__class__ == forms.widgets.TextInput:
if 'class' in field.widget.attrs:
field.widget.attrs['class'] += 'form-control'
else:
field.widget.attrs.update({'class': 'form-control'})
class AddressForm(forms.ModelForm): class AddressForm(UGSModelForm):
class Meta: class Meta:
model = Address model = Address
fields = '__all__' fields = '__all__'
# noinspection PyRedundantParentheses
widgets = { widgets = {
'geburtstag': forms.DateInput( 'geburtstag': forms.DateInput(
format=('%Y-%m-%d'),
attrs={'class': 'form-control',
'placeholder': 'Wähle ein Datum',
'type': 'date'
}
)
}
def is_valid(self): format='%Y-%m-%d',
return True attrs={ # 'class': 'form-control',
'type': 'date'
}
),
}
class SummaryForm(forms.ModelForm): class SummaryForm(UGSModelForm):
class Meta: class Meta:
model = Summary model = Summary
fields = '__all__' fields = '__all__'
@ -45,19 +49,19 @@ class SummaryForm(forms.ModelForm):
} }
class SalesAreaTypeForm(forms.ModelForm): class SalesAreaTypeForm(UGSModelForm):
class Meta: class Meta:
model = SalesAreaType model = SalesAreaType
fields = '__all__' fields = '__all__'
class SalesAreaForm(forms.ModelForm): class SalesAreaForm(UGSModelForm):
class Meta: class Meta:
model = SalesArea model = SalesArea
fields = '__all__' fields = '__all__'
class CompanyDataForm(forms.ModelForm): class CompanyDataForm(UGSModelForm):
class Meta: class Meta:
model = CompanyData model = CompanyData
fields = '__all__' fields = '__all__'

@ -1,4 +1,4 @@
# Generated by Django 5.0.1 on 2024-03-13 12:59 # Generated by Django 5.0.1 on 2024-03-14 13:26
import django.db.models.deletion import django.db.models.deletion
from django.db import migrations, models from django.db import migrations, models
@ -25,10 +25,12 @@ class Migration(migrations.Migration):
], ],
), ),
migrations.CreateModel( migrations.CreateModel(
name='SalesArea', name='CompanyData',
fields=[ fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('title', models.CharField(max_length=255)), ('title', models.CharField(max_length=255)),
('website', models.URLField()),
('startDate', models.DateField()),
], ],
), ),
migrations.CreateModel( migrations.CreateModel(
@ -46,18 +48,11 @@ class Migration(migrations.Migration):
], ],
), ),
migrations.CreateModel( migrations.CreateModel(
name='CompanyData', name='SalesArea',
fields=[ fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('title', models.CharField(max_length=255)), ('title', models.CharField(max_length=255)),
('website', models.URLField()), ('type', models.ForeignKey(on_delete=django.db.models.deletion.RESTRICT, to='ugssim.salesareatype')),
('startDate', models.DateField()),
('salesArea', models.ManyToManyField(related_name='+', to='ugssim.salesarea')),
], ],
), ),
migrations.AddField(
model_name='salesarea',
name='type',
field=models.ForeignKey(on_delete=django.db.models.deletion.RESTRICT, to='ugssim.salesareatype'),
),
] ]

@ -3,12 +3,14 @@ from datetime import date
from django import forms from django import forms
from django.db import models from django.db import models
from UGSdjangoProject import settings
# Create your models here. # Create your models here.
class Address(models.Model): class Address(models.Model):
vorname = models.CharField(max_length=255) vorname = models.CharField(max_length=255)
nachname = models.CharField(max_length=255) nachname = models.CharField(max_length=255)
geburtstag: date = models.DateField() geburtstag :date = models.DateField()
street = models.CharField(max_length=10) street = models.CharField(max_length=10)
hausnummer = models.CharField(max_length=255) hausnummer = models.CharField(max_length=255)
postleitzahl = models.CharField(max_length=5) postleitzahl = models.CharField(max_length=5)

@ -1,5 +1,4 @@
<div class="container"> <div class="container">
{% csrf_token %}
{% for field in companyDataForm %} {% for field in companyDataForm %}
<div class="form-group"> <div class="form-group">
<label for="{{ field.id_for_label }}">{{ field.label }}</label> <label for="{{ field.id_for_label }}">{{ field.label }}</label>

@ -1,19 +1,17 @@
<div class="container"> <div class="container">
{% load read_dictonary %}
<!-- <form method="post" class="form-group">--> <!-- <form method="post" class="form-group">-->
{% csrf_token %} {{ description }}
{% for field in addressForm %} {% for field in myform %}
<div class="form-group"> <div class="form-group">
<label for="{{ field.id_for_label }}">{{ field.label }}</label> {% if field.html_name == "description" %}
<input class="form-control" {% else %}
type="{{ field.field.widget.input_type }}" <label for="{{ field.id_for_label }}">{{ field.label }}</label>
name="{{ field.html_name }}" {{field }}
id="{{ field.auto_id }}" {% endif %}
value="{{ field.value|default_if_none:"" }}"
>
</div> </div>
{% endfor %} {% endfor %}
<button type="submit" class="btn btn-primary" name="addressButton">Submit</button> <button type="submit" class="btn btn-primary" name="{{ modelname }}Button">Submit</button>
<!--</form> --> <!--</form> -->
</div> </div>

@ -1,51 +1,31 @@
{% extends 'ugssim/ugssim.html' %} {% extends 'ugssim/ugssim.html' %}
{% load read_dictonary %}
{% block content %} {% block content %}
<form method="post" class="form-group"> <form method="post" class="form-group" action="/planungsparameter/">
{% csrf_token %}
<div class="accordion" id="accordionPlanning"> <div class="accordion" id="accordionPlanning">
<div class="accordion-item"> {% define '' as show %}
<h2 class="accordion-header"> {% for key,value in formlist.items %}
<button class="accordion-button" type="button" data-bs-toggle="collapse" {% define value|lookup:'form' as myform %}
data-bs-target="#collapseOne" {% define value|lookup:'modelname' as modelname %}
aria-expanded="true" aria-controls="collapseOne"> {% define value|lookup:'description' as description %}
Mandantendaten <div class="accordion-item">
</button> <h2 class="accordion-header">
</h2> <button class="accordion-button" type="button" data-bs-toggle="collapse"
<div id="collapseOne" class="accordion-collapse collapse show" data-bs-parent="#accordionPlanning"> data-bs-target="#collapse{{ modelname }}"
<div class="accordion-body"> aria-expanded="true" aria-controls="collapse{{ modelname }}">
{% include 'planungsparameter/mandantendaten.html' %} {{ value|lookup:'heading' }}
</button>
</h2>
<div id="collapse{{ modelname }}" class="accordion-collapse collapse {{ show }}" data-bs-parent="#accordionPlanning">
<div class="accordion-body">
{% include 'planungsparameter/mandantendaten.html' %}
</div>
</div> </div>
</div> </div>
</div>
<div class="accordion-item"> {% endfor %}
<h2 class="accordion-header">
<button class="accordion-button collapsed" type="button" data-bs-toggle="collapse"
data-bs-target="#collapseTwo" aria-expanded="false" aria-controls="collapseTwo">
Kurzfassung
</button>
</h2>
<div id="collapseTwo" class="accordion-collapse collapse" data-bs-parent="#accordionPlanning">
<div class="accordion-body">
{% include 'planungsparameter/summary.html' %}
</div>
</div>
</div>
<div class="accordion-item">
<h2 class="accordion-header">
<button class="accordion-button collapsed" type="button" data-bs-toggle="collapse"
data-bs-target="#collapseThree" aria-expanded="false" aria-controls="collapseThree">
Unternehmensdaten
</button>
</h2>
<div id="collapseThree" class="accordion-collapse collapse" data-bs-parent="#accordionPlanning">
<div class="accordion-body">
{% include 'planungsparameter/companydata.html' %}
</div>
</div>
</div>
</div> </div>
</form> </form>
<!-- Add more sections here -->
{% endblock content %} {% endblock content %}
</div> </div>

@ -1,6 +1,5 @@
<div class="container"> <div class="container">
<form method="post" class="form-group">
{% csrf_token %}
{% for field in summaryForm %} {% for field in summaryForm %}
<div class="form-group"> <div class="form-group">
<label for="{{ field.id_for_label }}">{{ field.label }}</label> <label for="{{ field.id_for_label }}">{{ field.label }}</label>
@ -8,5 +7,5 @@
</div> </div>
{% endfor %} {% endfor %}
<button type="submit" class="btn btn-primary" name="summaryButton">Submit</button> <button type="submit" class="btn btn-primary" name="summaryButton">Submit</button>
</form>
</div> </div>

@ -1,4 +1,5 @@
{% load static %} {% load i18n l10n static read_dictonary %}
<script src="{% static 'bootstrap/js/bootstrap.bundle.js' %}"></script> <script src="{% static 'bootstrap/js/bootstrap.bundle.js' %}"></script>
<!DOCTYPE html> <!DOCTYPE html>
<html lang="de"> <html lang="de">
@ -18,5 +19,5 @@
{% include 'ugssim/navigation.html' %} {% include 'ugssim/navigation.html' %}
{% block content %} {% block content %}
{% endblock %} {% endblock %}
<script src="{% static 'bootstrap/js/bootstrap.bundle.js' %}"></script>
</body> </body>

@ -0,0 +1,28 @@
from django import template
from django.template.loader_tags import register
register = template.Library()
@register.filter(name='lookup')
def lookup(value, arg):
"""
Returns the value to key of a dictionary
:param value: The dictonary to perform the lookup on.
:param arg: The key used to perform the lookup.
:return: The value of the lookup operation.
"""
return value[arg]
@register.simple_tag
def define(val=None):
"""
Assigns the given value to a variable.
:param val: The value to assign. If not provided, the value will be None.
:return: The assigned value.
"""
return val

@ -5,14 +5,11 @@ from django.shortcuts import render
from .form import * from .form import *
from .models import * from .models import *
from django.forms.models import model_to_dict from django.forms.models import model_to_dict
import sys
from django.views.generic import TemplateView
def get_class(classname):
# from ugssim.form import NameForm return getattr(sys.modules[__name__], classname)
# Create your views here.
def index(request): def index(request):
@ -20,34 +17,44 @@ def index(request):
def planungsparameter(request): def planungsparameter(request):
addressForm = AddressForm() '''
summaryForm = SummaryForm() Die Erzeugung der Webformulare soll dynamisch auf Basis der Model und Form Klassen
companyDataForm = CompanyDataForm() geschehen.
if request.method == "POST": Dafür wird eine Liste mit den Klassenname der Models angelegt über die iteriert wird
rp = request.POST Über die Funktion get_class(classname) erhält man das Klassenobjekt
if 'addressButton' in rp: modelclass für das Model
addressForm = AddressForm(request.POST) formclass für das Form
if addressForm.is_valid(): über diese wird dann iterierter.
#Address.objects.create(**addressForm.cleaned_data) Ein Formularfeld 'description' ist bei jedem Formular vorhanden, da die aber nicht
addressForm.save() in der Datenbank /Model vorhanden ist. Daher wird dieses Feld entfernt (pop)
elif 'summaryButton' in rp: '''
summaryForm = SummaryForm(request.POST) formlist = {}
if summaryForm.is_valid(): modellist = ['Address', 'Summary', 'CompanyData']
Summary.objects.update(**summaryForm.cleaned_data) for modelname in modellist:
elif 'companyDataButton' in rp: # globals()[ + 'Form'] = get_class( + 'Form')
companyDataForm = CompanyDataForm(request.POST) modelclass = get_class(modelname)
if companyDataForm.is_valid(): formclass = get_class(modelname + 'Form')
CompanyData.objects.update(**companyDataForm.cleaned_data) if request.method == "POST":
else: rp = request.POST
initial = model_to_dict(Address.objects.filter(id=1).first()) if modelname + 'Button' in rp:
addressForm = AddressForm(initial=initial) form = formclass(request.POST)
form.fields.pop('description')
if form.is_valid():
modelclass.objects.update(**form.cleaned_data)
else:
initial = {'description': 'Tester'}
# initial.update(model_to_dict(modelclass.objects.filter(id=1).first()))
form = formclass()
formpart = {
'modelname': modelname,
'form': form,
'heading': 'Mandatendaten2',
'description': 'Dict Descriptiopn'
}
formlist.update({modelname + "form": formpart})
context = { context = {
'addressForm': addressForm, 'formlist': formlist
'summaryForm': summaryForm,
'companyDataForm': companyDataForm
} }
return render(request, 'planungsparameter/planungsparameter.html', context) return render(request, 'planungsparameter/planungsparameter.html', context)

Loading…
Cancel
Save