From a26752044b381690ee957e9965eaca6d3622d3fd Mon Sep 17 00:00:00 2001 From: Ulf Wagner Date: Fri, 15 Mar 2024 11:19:20 +0100 Subject: [PATCH] Eingabefelder werden dynamisch aus dem Model/Form erzeugt. --- UGSdjangoProject/.idea/dataSources.xml | 21 +++ UGSdjangoProject/.idea/dbnavigator.xml | 123 +++++++++++++++++- UGSdjangoProject/.idea/sqldialects.xml | 6 + UGSdjangoProject/UGSdjangoProject/settings.py | 19 ++- UGSdjangoProject/ugssim/form.py | 58 +++++---- .../ugssim/migrations/0001_initial.py | 17 +-- UGSdjangoProject/ugssim/models.py | 4 +- .../planungsparameter/companydata.html | 1 - .../planungsparameter/mandantendaten.html | 22 ++-- .../planungsparameter/planungsparameter.html | 64 ++++----- .../templates/planungsparameter/summary.html | 5 +- .../ugssim/templates/ugssim/ugssim.html | 5 +- .../ugssim/templatetags/__init__.py | 0 .../ugssim/templatetags/read_dictonary.py | 28 ++++ UGSdjangoProject/ugssim/views.py | 71 +++++----- 15 files changed, 301 insertions(+), 143 deletions(-) create mode 100644 UGSdjangoProject/.idea/dataSources.xml create mode 100644 UGSdjangoProject/.idea/sqldialects.xml create mode 100644 UGSdjangoProject/ugssim/templatetags/__init__.py create mode 100644 UGSdjangoProject/ugssim/templatetags/read_dictonary.py diff --git a/UGSdjangoProject/.idea/dataSources.xml b/UGSdjangoProject/.idea/dataSources.xml new file mode 100644 index 0000000..263777d --- /dev/null +++ b/UGSdjangoProject/.idea/dataSources.xml @@ -0,0 +1,21 @@ + + + + + sqlite.xerial + true + true + $PROJECT_DIR$/UGSdjangoProject/settings.py + org.sqlite.JDBC + jdbc:sqlite:C:\Users\Ulf Wagner\PycharmProjects\UGSdjangoProject\db.sqlite3 + $ProjectFileDir$ + + + mariadb + true + org.mariadb.jdbc.Driver + jdbc:mariadb://localhost:3306/ugssim + $ProjectFileDir$ + + + \ No newline at end of file diff --git a/UGSdjangoProject/.idea/dbnavigator.xml b/UGSdjangoProject/.idea/dbnavigator.xml index 8287d40..2bafdcb 100644 --- a/UGSdjangoProject/.idea/dbnavigator.xml +++ b/UGSdjangoProject/.idea/dbnavigator.xml @@ -1,16 +1,135 @@ + + + + + + + + + + + + + - + + + + + + + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
diff --git a/UGSdjangoProject/.idea/sqldialects.xml b/UGSdjangoProject/.idea/sqldialects.xml new file mode 100644 index 0000000..c0e01ca --- /dev/null +++ b/UGSdjangoProject/.idea/sqldialects.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/UGSdjangoProject/UGSdjangoProject/settings.py b/UGSdjangoProject/UGSdjangoProject/settings.py index 373a11b..567c58f 100644 --- a/UGSdjangoProject/UGSdjangoProject/settings.py +++ b/UGSdjangoProject/UGSdjangoProject/settings.py @@ -15,7 +15,6 @@ from pathlib import Path # Build paths inside the project like this: BASE_DIR / 'subdir'. BASE_DIR = Path(__file__).resolve().parent.parent - # Quick-start development settings - unsuitable for production # See https://docs.djangoproject.com/en/5.0/howto/deployment/checklist/ @@ -27,7 +26,6 @@ DEBUG = True ALLOWED_HOSTS = [] - # Application definition INSTALLED_APPS = [ @@ -71,18 +69,20 @@ TEMPLATES = [ WSGI_APPLICATION = 'UGSdjangoProject.wsgi.application' - # Database # https://docs.djangoproject.com/en/5.0/ref/settings/#databases DATABASES = { 'default': { - 'ENGINE': 'django.db.backends.sqlite3', - 'NAME': BASE_DIR / 'db.sqlite3', + 'ENGINE': 'django.db.backends.mysql', + 'NAME': 'ugssim', + 'USER': 'ugssimuser', + 'PASSWORD': 'Tradition2-Ransack-Retrial', + 'HOST': 'localhost', + 'PORT': '3306', } } - # Password validation # https://docs.djangoproject.com/en/5.0/ref/settings/#auth-password-validators @@ -101,11 +101,10 @@ AUTH_PASSWORD_VALIDATORS = [ }, ] - # Internationalization # https://docs.djangoproject.com/en/5.0/topics/i18n/ -LANGUAGE_CODE = 'de-de' +LANGUAGE_CODE = 'de' TIME_ZONE = 'UTC' @@ -113,7 +112,6 @@ USE_I18N = True USE_TZ = True - # Static files (CSS, JavaScript, Images) # 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")] -#DATE_INPUT_FORMATS = ['%d-%m-%Y'] \ No newline at end of file +DATE_FORMAT = '%Y-%m-%d' +DATE_INPUT_FORMATS = '%Y-%m-%d' diff --git a/UGSdjangoProject/ugssim/form.py b/UGSdjangoProject/ugssim/form.py index d754a5e..4389f23 100644 --- a/UGSdjangoProject/ugssim/form.py +++ b/UGSdjangoProject/ugssim/form.py @@ -1,42 +1,46 @@ from django import forms from django.forms import DateInput -from .models import * - +from ugssim.models import * +from ugssim.models import Address from django import forms -'''' -class AddressForm(forms.Form): - vorname = forms.CharField(max_length=255) - nachname = forms.CharField(max_length=255) - geburtstag = forms.DateField(widget=forms.SelectDateWidget) - street = forms.CharField(max_length=255) - hausnummer = forms.CharField(max_length=10) - postleitzahl = forms.CharField(max_length=5) - -''' + +class UGSModelForm(forms.ModelForm): + def __init__(self, *args, **kwargs): + super(forms.ModelForm, self).__init__(*args, **kwargs) + # 'description should be the first field + # value = self.fields.pop('description') + # copy = self.fields.copy() + # 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: model = Address fields = '__all__' - # noinspection PyRedundantParentheses widgets = { 'geburtstag': forms.DateInput( - format=('%Y-%m-%d'), - attrs={'class': 'form-control', - 'placeholder': 'Wähle ein Datum', - 'type': 'date' - } - ) - } - def is_valid(self): - return True + format='%Y-%m-%d', + attrs={ # 'class': 'form-control', + 'type': 'date' + } + ), + + } -class SummaryForm(forms.ModelForm): +class SummaryForm(UGSModelForm): class Meta: model = Summary fields = '__all__' @@ -45,19 +49,19 @@ class SummaryForm(forms.ModelForm): } -class SalesAreaTypeForm(forms.ModelForm): +class SalesAreaTypeForm(UGSModelForm): class Meta: model = SalesAreaType fields = '__all__' -class SalesAreaForm(forms.ModelForm): +class SalesAreaForm(UGSModelForm): class Meta: model = SalesArea fields = '__all__' -class CompanyDataForm(forms.ModelForm): +class CompanyDataForm(UGSModelForm): class Meta: model = CompanyData fields = '__all__' diff --git a/UGSdjangoProject/ugssim/migrations/0001_initial.py b/UGSdjangoProject/ugssim/migrations/0001_initial.py index b90ecdc..3c908df 100644 --- a/UGSdjangoProject/ugssim/migrations/0001_initial.py +++ b/UGSdjangoProject/ugssim/migrations/0001_initial.py @@ -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 from django.db import migrations, models @@ -25,10 +25,12 @@ class Migration(migrations.Migration): ], ), migrations.CreateModel( - name='SalesArea', + name='CompanyData', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('title', models.CharField(max_length=255)), + ('website', models.URLField()), + ('startDate', models.DateField()), ], ), migrations.CreateModel( @@ -46,18 +48,11 @@ class Migration(migrations.Migration): ], ), migrations.CreateModel( - name='CompanyData', + name='SalesArea', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('title', models.CharField(max_length=255)), - ('website', models.URLField()), - ('startDate', models.DateField()), - ('salesArea', models.ManyToManyField(related_name='+', to='ugssim.salesarea')), + ('type', models.ForeignKey(on_delete=django.db.models.deletion.RESTRICT, to='ugssim.salesareatype')), ], ), - migrations.AddField( - model_name='salesarea', - name='type', - field=models.ForeignKey(on_delete=django.db.models.deletion.RESTRICT, to='ugssim.salesareatype'), - ), ] diff --git a/UGSdjangoProject/ugssim/models.py b/UGSdjangoProject/ugssim/models.py index 3ca2d1f..fe279db 100644 --- a/UGSdjangoProject/ugssim/models.py +++ b/UGSdjangoProject/ugssim/models.py @@ -3,12 +3,14 @@ from datetime import date from django import forms from django.db import models +from UGSdjangoProject import settings + # Create your models here. class Address(models.Model): vorname = 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) hausnummer = models.CharField(max_length=255) postleitzahl = models.CharField(max_length=5) diff --git a/UGSdjangoProject/ugssim/templates/planungsparameter/companydata.html b/UGSdjangoProject/ugssim/templates/planungsparameter/companydata.html index ec850a3..9888c10 100644 --- a/UGSdjangoProject/ugssim/templates/planungsparameter/companydata.html +++ b/UGSdjangoProject/ugssim/templates/planungsparameter/companydata.html @@ -1,5 +1,4 @@
- {% csrf_token %} {% for field in companyDataForm %}
diff --git a/UGSdjangoProject/ugssim/templates/planungsparameter/mandantendaten.html b/UGSdjangoProject/ugssim/templates/planungsparameter/mandantendaten.html index 0efd116..a923541 100644 --- a/UGSdjangoProject/ugssim/templates/planungsparameter/mandantendaten.html +++ b/UGSdjangoProject/ugssim/templates/planungsparameter/mandantendaten.html @@ -1,19 +1,17 @@
- +{% load read_dictonary %} - {% csrf_token %} - {% for field in addressForm %} -
- - + {{ description }} + {% for field in myform %} +
+ {% if field.html_name == "description" %} + {% else %} + + {{field }} + {% endif %}
{% endfor %} - +
\ No newline at end of file diff --git a/UGSdjangoProject/ugssim/templates/planungsparameter/planungsparameter.html b/UGSdjangoProject/ugssim/templates/planungsparameter/planungsparameter.html index d938e24..b844acf 100644 --- a/UGSdjangoProject/ugssim/templates/planungsparameter/planungsparameter.html +++ b/UGSdjangoProject/ugssim/templates/planungsparameter/planungsparameter.html @@ -1,51 +1,31 @@ {% extends 'ugssim/ugssim.html' %} +{% load read_dictonary %} {% block content %} -
+ + {% csrf_token %}
-
-

- -

-
-
- {% include 'planungsparameter/mandantendaten.html' %} + {% define '' as show %} + {% for key,value in formlist.items %} + {% define value|lookup:'form' as myform %} + {% define value|lookup:'modelname' as modelname %} + {% define value|lookup:'description' as description %} +
+

+ +

+
+
+ {% include 'planungsparameter/mandantendaten.html' %} +
-
-
-

- -

- - -
-
- {% include 'planungsparameter/summary.html' %} -
-
-
-
-

- -

-
-
- {% include 'planungsparameter/companydata.html' %} -
-
-
+ + {% endfor %}
- {% endblock content %}
\ No newline at end of file diff --git a/UGSdjangoProject/ugssim/templates/planungsparameter/summary.html b/UGSdjangoProject/ugssim/templates/planungsparameter/summary.html index c78a4b9..5eb76a6 100644 --- a/UGSdjangoProject/ugssim/templates/planungsparameter/summary.html +++ b/UGSdjangoProject/ugssim/templates/planungsparameter/summary.html @@ -1,6 +1,5 @@
-
- {% csrf_token %} + {% for field in summaryForm %}
@@ -8,5 +7,5 @@
{% endfor %} -
+
\ No newline at end of file diff --git a/UGSdjangoProject/ugssim/templates/ugssim/ugssim.html b/UGSdjangoProject/ugssim/templates/ugssim/ugssim.html index 98f55b7..3574b57 100644 --- a/UGSdjangoProject/ugssim/templates/ugssim/ugssim.html +++ b/UGSdjangoProject/ugssim/templates/ugssim/ugssim.html @@ -1,4 +1,5 @@ -{% load static %} +{% load i18n l10n static read_dictonary %} + @@ -18,5 +19,5 @@ {% include 'ugssim/navigation.html' %} {% block content %} {% endblock %} - + \ No newline at end of file diff --git a/UGSdjangoProject/ugssim/templatetags/__init__.py b/UGSdjangoProject/ugssim/templatetags/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/UGSdjangoProject/ugssim/templatetags/read_dictonary.py b/UGSdjangoProject/ugssim/templatetags/read_dictonary.py new file mode 100644 index 0000000..eaf4978 --- /dev/null +++ b/UGSdjangoProject/ugssim/templatetags/read_dictonary.py @@ -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 diff --git a/UGSdjangoProject/ugssim/views.py b/UGSdjangoProject/ugssim/views.py index bd1ce35..b605a19 100644 --- a/UGSdjangoProject/ugssim/views.py +++ b/UGSdjangoProject/ugssim/views.py @@ -5,14 +5,11 @@ from django.shortcuts import render from .form import * from .models import * from django.forms.models import model_to_dict +import sys -from django.views.generic import TemplateView - -# from ugssim.form import NameForm - - -# Create your views here. +def get_class(classname): + return getattr(sys.modules[__name__], classname) def index(request): @@ -20,34 +17,44 @@ def index(request): def planungsparameter(request): - addressForm = AddressForm() - summaryForm = SummaryForm() - companyDataForm = CompanyDataForm() - if request.method == "POST": - rp = request.POST - if 'addressButton' in rp: - addressForm = AddressForm(request.POST) - if addressForm.is_valid(): - #Address.objects.create(**addressForm.cleaned_data) - addressForm.save() - elif 'summaryButton' in rp: - summaryForm = SummaryForm(request.POST) - if summaryForm.is_valid(): - Summary.objects.update(**summaryForm.cleaned_data) - elif 'companyDataButton' in rp: - companyDataForm = CompanyDataForm(request.POST) - if companyDataForm.is_valid(): - CompanyData.objects.update(**companyDataForm.cleaned_data) - else: - initial = model_to_dict(Address.objects.filter(id=1).first()) - addressForm = AddressForm(initial=initial) - + ''' + Die Erzeugung der Webformulare soll dynamisch auf Basis der Model und Form Klassen + geschehen. + Dafür wird eine Liste mit den Klassenname der Models angelegt über die iteriert wird + Über die Funktion get_class(classname) erhält man das Klassenobjekt + modelclass für das Model + formclass für das Form + über diese wird dann iterierter. + Ein Formularfeld 'description' ist bei jedem Formular vorhanden, da die aber nicht + in der Datenbank /Model vorhanden ist. Daher wird dieses Feld entfernt (pop) + ''' + formlist = {} + modellist = ['Address', 'Summary', 'CompanyData'] + for modelname in modellist: + # globals()[ + 'Form'] = get_class( + 'Form') + modelclass = get_class(modelname) + formclass = get_class(modelname + 'Form') + if request.method == "POST": + rp = request.POST + if modelname + 'Button' in rp: + 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 = { - 'addressForm': addressForm, - 'summaryForm': summaryForm, - 'companyDataForm': companyDataForm - + 'formlist': formlist } return render(request, 'planungsparameter/planungsparameter.html', context)