Ansatz zu neuem Projekt
Hallo zusammen,
Ich hoffe, ihr hattet erholsame Feiertage und genießt noch die Zeit.
Für mein neues Projekt brauche ich Unterstützung bei der Herangehensweise.
Es sollen NFC-Tags mit Android oder IOS ausgelesen undd dann eine Information wie "Tag1" an ein Netzwerk oder eine Cloud-Adresse gesenden. Dort soll die Information mit Datum, Uhrzeit und Absender gespeichert werden.
Anschließend wird das Ergebnis visualisiert und gefiltert.
Zum Versenden kann ich UDP-Nachrichten, HTTP GET, POST oder REST verwenden.
Mit Python habe ich schon einige Erfahrung, mit http habe ich mich noch nicht beschäftigt.
Daher sehe ich kein Problem darin, ein Programm zu schreiben, das die UDB-Meldungen in eine csv-Datei schreibt.
An dieser Stelle möchte ich fragen: Wie macht man das heute?
Bzw. möchte ich die Daten auf einer Webadresse darstellen.
Das geht wahrscheinlich mit Graphana cloud, aber wie und wo lege ich die Daten dafür ab.
Am liebsten würde ich dafür eine Cloud Db verwenden.
Wahrscheinlich gibt es dafür schon fertige Codes. Die Suche hat aber noch keinen brauchbaren Code gefunden, weil ich wahrscheinlich falsch frage.
Wie kann ich das am einfachsten machen?
Am besten in der Cloud (Graphana Cloud, Google Drive etc.).
Ich kann auch einen Docker Container extern zur Verfügung stellen, und diesen Compose erstellen.
Es wird 5-30 Einträge die Woche geben.
Wei würdet ihr das machen?
Feierliche Grüsse
Gerhard
Ich hoffe, ihr hattet erholsame Feiertage und genießt noch die Zeit.
Für mein neues Projekt brauche ich Unterstützung bei der Herangehensweise.
Es sollen NFC-Tags mit Android oder IOS ausgelesen undd dann eine Information wie "Tag1" an ein Netzwerk oder eine Cloud-Adresse gesenden. Dort soll die Information mit Datum, Uhrzeit und Absender gespeichert werden.
Anschließend wird das Ergebnis visualisiert und gefiltert.
Zum Versenden kann ich UDP-Nachrichten, HTTP GET, POST oder REST verwenden.
Mit Python habe ich schon einige Erfahrung, mit http habe ich mich noch nicht beschäftigt.
Daher sehe ich kein Problem darin, ein Programm zu schreiben, das die UDB-Meldungen in eine csv-Datei schreibt.
An dieser Stelle möchte ich fragen: Wie macht man das heute?
Bzw. möchte ich die Daten auf einer Webadresse darstellen.
Das geht wahrscheinlich mit Graphana cloud, aber wie und wo lege ich die Daten dafür ab.
Am liebsten würde ich dafür eine Cloud Db verwenden.
Wahrscheinlich gibt es dafür schon fertige Codes. Die Suche hat aber noch keinen brauchbaren Code gefunden, weil ich wahrscheinlich falsch frage.
Wie kann ich das am einfachsten machen?
Am besten in der Cloud (Graphana Cloud, Google Drive etc.).
Ich kann auch einen Docker Container extern zur Verfügung stellen, und diesen Compose erstellen.
Es wird 5-30 Einträge die Woche geben.
Wei würdet ihr das machen?
Feierliche Grüsse
Gerhard
UDP halte ich fuer ungeeignet. Du hast einzelne Ereignisse, keinen Strom von Ereignissen, bei denen auch mal eines verloren gehen kann. Also sollte es REST sein, und weil etwas angelegt wird, HTTP POST oder ggf. PUT, wenn man es sehr ernst meint mit REST.
Was fuer eine Datenbank und Visualisierung geeignet sind, kann ich mit den gegebenen Informationen nicht beantworten. Grafana und Co, sowie InfluxDB dahinter, sind ja eher fuer continuierliche Daten (Temperatur etc) ausgelegt. Ob und was hier gut zur Darstellung geeignet ist, haengt davon ab, was die Daten denn meinen. Bei der DB macht man mit Postgres sicher nichts falsch, gibt's natuerlich auch in der Cloud.
Was fuer eine Datenbank und Visualisierung geeignet sind, kann ich mit den gegebenen Informationen nicht beantworten. Grafana und Co, sowie InfluxDB dahinter, sind ja eher fuer continuierliche Daten (Temperatur etc) ausgelegt. Ob und was hier gut zur Darstellung geeignet ist, haengt davon ab, was die Daten denn meinen. Bei der DB macht man mit Postgres sicher nichts falsch, gibt's natuerlich auch in der Cloud.
- noisefloor
- User
- Beiträge: 3866
- Registriert: Mittwoch 17. Oktober 2007, 21:40
- Wohnort: WW
- Kontaktdaten:
Hallo,
willst oder musst du die App für iOS / Android schreiben oder den serverseitigen Teil oder beides?
Bei UDP hast du keinerlei Garantie, dass die Paket auch wirklich angekommen sind. Von daher hier eher ungeeignet. Da bietet sich stark TCP an.
Gruß, noisefloor
willst oder musst du die App für iOS / Android schreiben oder den serverseitigen Teil oder beides?
Bei UDP hast du keinerlei Garantie, dass die Paket auch wirklich angekommen sind. Von daher hier eher ungeeignet. Da bietet sich stark TCP an.
Gruß, noisefloor
Vielen Dank für die Antworten,
Es gibt fertige Apps für mobile Geräte, ich muss nur die Serverseite schreiben.
Ich werde mich mal mit http Post beschäftigen und schauen ob put auch möglich ist.
Das wird sich nahc ersten tests zeigen.
Postgrest werde ich gleich mal in einem Container erstellen, es gibt verschiedene Guiˋs, evetuekll reichen diese schon für die Visualisierung.
Die Daten müssen eigentlich nur wie in Excel gefiltert und sortiert werden.
Sie müssen nur sichtbar da sein eventeull export in einde PDF.
Es gibt fertige Apps für mobile Geräte, ich muss nur die Serverseite schreiben.
Ich werde mich mal mit http Post beschäftigen und schauen ob put auch möglich ist.
Das wird sich nahc ersten tests zeigen.
Postgrest werde ich gleich mal in einem Container erstellen, es gibt verschiedene Guiˋs, evetuekll reichen diese schon für die Visualisierung.
Die Daten müssen eigentlich nur wie in Excel gefiltert und sortiert werden.
Sie müssen nur sichtbar da sein eventeull export in einde PDF.
- noisefloor
- User
- Beiträge: 3866
- Registriert: Mittwoch 17. Oktober 2007, 21:40
- Wohnort: WW
- Kontaktdaten:
Hallo,
serverseitig was zu Programmieren, was POST oder PUT Request entgegennimmt und dann in eine DB speichert ist relativ einfach. Geht mal allen gängigen Webframeworks wie Django, Flask oder FastAPI. Letzteres würde dann tatsächlich nur die API bereitstellen. Mit Django und Flask könntest du auch die Ergebnisseiten erstellen. Django hat dafür alles an Bord, bei Flask musst du ein mindestens ein Modul zum Ansprechen der DB noch zusätzlich installieren.
Gruß, noisefloor
serverseitig was zu Programmieren, was POST oder PUT Request entgegennimmt und dann in eine DB speichert ist relativ einfach. Geht mal allen gängigen Webframeworks wie Django, Flask oder FastAPI. Letzteres würde dann tatsächlich nur die API bereitstellen. Mit Django und Flask könntest du auch die Ergebnisseiten erstellen. Django hat dafür alles an Bord, bei Flask musst du ein mindestens ein Modul zum Ansprechen der DB noch zusätzlich installieren.
Gruß, noisefloor
Hallo zusammen,
Ich habe mich mit Django und dem Einführungsbeispiel Pycharm Django beschäftigt.
https://www.jetbrains.com/help/pycharm/ ... nch-server
Mit ein paar Änderungen ist das Grundgerüst so wie ich es brauche.
Die Datenbank und die Visualisierung sind also fertig.
models.py
views.py
index.py
Über die Admin-Seite kann ich die Einträge bearbeiten:
Bevor ich mich mit der Django Rest API beschäftige, möchte ich die Einträge einfach per http get und post? Bearbeiten.
Habe aber noch nicht verstanden, wie das geht.
Habt ihr irgendwelche Beispiele für mich?
Besten Dank und Grüsse
Ich habe mich mit Django und dem Einführungsbeispiel Pycharm Django beschäftigt.
https://www.jetbrains.com/help/pycharm/ ... nch-server
Mit ein paar Änderungen ist das Grundgerüst so wie ich es brauche.
Die Datenbank und die Visualisierung sind also fertig.
models.py
Code: Alles auswählen
class ToDoItem(models.Model):
Ort = models.CharField(max_length=100)
Arbeit = models.CharField(max_length=100)
Datum = models.DateField(default=timezone.now)
Uhrzeit = models.TimeField(default=timezone.now)
def __str__(self):
return f"{self.Ort} {self.Arbeit} am {self.Datum}:{self.Uhrzeit}"
Code: Alles auswählen
class AllToDos(ListView):
model = ToDoItem
template_name = "Checkliste/index.html"
def get_queryset(self):
return ToDoItem.objects.filter(Datum__gte=date.today())
class TodayToDos(ListView):
model = ToDoItem
template_name = "Checkliste/today.html"
def get_queryset(self):
return ToDoItem.objects.filter(Datum=date.today())
Code: Alles auswählen
{% extends "base.html" %}
{% block content %}
<h1>Checkliste wurde durchgeführt:</h1>
<table>
{% for item in object_list %}
<tr>
<td>{{ item.Ort }}</td>
<td>{{ item.Arbeit }}</td>
<td>{{ item.Datum }}</td>
<td>{{ item.Uhrzeit }}</td>
</tr>
{% endfor %}
</table>
{% endblock %}
Bevor ich mich mit der Django Rest API beschäftige, möchte ich die Einträge einfach per http get und post? Bearbeiten.
Habe aber noch nicht verstanden, wie das geht.
Habt ihr irgendwelche Beispiele für mich?
Besten Dank und Grüsse
- noisefloor
- User
- Beiträge: 3866
- Registriert: Mittwoch 17. Oktober 2007, 21:40
- Wohnort: WW
- Kontaktdaten:
Hallo,
du benutzt doch schon CBV (Class Based Views) in deinem Code. Bei CBV gibt es auch eine fertige EditView, CreteView und DeleteView. Dann hast du das volle Programm zu Editieren / Anlegen / Löschen von DB Einträgen für ein Formular auf einer Webseite.
Doku: https://docs.djangoproject.com/en/5.0/t ... sed-views/ und Folgeseiten.
Gruß, noisefloor
du benutzt doch schon CBV (Class Based Views) in deinem Code. Bei CBV gibt es auch eine fertige EditView, CreteView und DeleteView. Dann hast du das volle Programm zu Editieren / Anlegen / Löschen von DB Einträgen für ein Formular auf einer Webseite.
Doku: https://docs.djangoproject.com/en/5.0/t ... sed-views/ und Folgeseiten.
Gruß, noisefloor
Genau das meiste ist fertig, ich muss am Ende über mobile Geräte Einträge hinzufügen.noisefloor hat geschrieben: ↑Donnerstag 11. Januar 2024, 07:25 Hallo,
du benutzt doch schon CBV (Class Based Views) in deinem Code. Bei CBV gibt es auch eine fertige EditView, CreteView und DeleteView. Dann hast du das volle Programm zu Editieren / Anlegen / Löschen von DB Einträgen für ein Formular auf einer Webseite.
Doku: https://docs.djangoproject.com/en/5.0/t ... sed-views/ und Folgeseiten.
Gruß, noisefloor
Zum Testen möchte ich das mal mit einem Post befehl machen.
Get habe ich hinbekommen:
Code: Alles auswählen
import requests
url = "http://localhost:8000/Checkliste/"
r = requests.get(url)
print(r.text)
Code: Alles auswählen
Connected to pydev debugger (build 233.13135.95)
<!doctype html>
<html lang="de">
<head>
<meta charset="UTF-8">
<meta name="viewport"
content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<link rel="stylesheet" href="https://cdn.simplecss.org/simple.min.css">
<body>
<div>
<a class="button" href='/Checkliste/'>Alle Einträge</a>
<a class="button" href='/Checkliste/heute/'>Heutige Einträge</a>
</div>
<h1>Checkliste wurde durchgeführt:</h1>
<table>
<tr>
<td>Gastraum</td>
<td>reinigen</td>
<td>11. Januar 2024</td>
<td>03:08</td>
</tr>
<tr>
<td>Gastraum</td>
<td>Reinigung</td>
<td>11. Januar 2024</td>
<td>05:15</td>
</tr>
<tr>
<td>Küche</td>
<td>Reinigung</td>
<td>11. Januar 2024</td>
<td>05:16</td>
</tr>
<tr>
<td>Küche</td>
<td>Reinigung</td>
<td>11. Januar 2024</td>
<td>06:17</td>
</tr>
</table>
</body>
</html>
so müsste de r post vermutlich aussehen:
Code: Alles auswählen
print("post")
urlpost = 'http://localhost:8000/Checkliste'
myobj = {'Ort': 'Lager', 'Arbeit': 'reinigen', 'DaTum': '11.01.2024', 'Uhrzeit': '7:46'}
x = requests.post(url, json = myobj)
print(x.text)
Fehlt noch ein log in?post
<!DOCTYPE html>
<html lang="en">
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<meta name="robots" content="NONE,NOARCHIVE">
<title>403 Forbidden</title>
<style type="text/css">
html * { padding:0; margin:0; }
body * { padding:10px 20px; }
body * * { padding:0; }
body { font:small sans-serif; background:#eee; color:#000; }
body>div { border-bottom:1px solid #ddd; }
h1 { font-weight:normal; margin-bottom:.4em; }
h1 span { font-size:60%; color:#666; font-weight:normal; }
#info { background:#f6f6f6; }
#info ul { margin: 0.5em 4em; }
#info p, #summary p { padding-top:10px; }
#summary { background: #ffc; }
#explanation { background:#eee; border-bottom: 0px none; }
</style>
</head>
<body>
<div id="summary">
<h1>Verboten <span>(403)</span></h1>
<p>CSRF-Verifizierung fehlgeschlagen. Anfrage abgebrochen.</p>
<p>Sie sehen Diese Nachricht, da diese Seite einen CSRF-Cookie beim Verarbeiten von Formulardaten benötigt. Dieses Cookie ist aus Sicherheitsgründen notwendig, um sicherzustellen, dass Ihr Webbrowser nicht von Dritten missbraucht wird.</p>
<p>Falls Sie Cookies in Ihren Webbrowser deaktiviert haben, müssen Sie sie mindestens für diese Seite oder für „Same-Origin“-Verbindungen reaktivieren.</p>
</div>
<div id="info">
<h2>Help</h2>
<p>Reason given for failure:</p>
<pre>
CSRF cookie not set.
</pre>
<p>In general, this can occur when there is a genuine Cross Site Request Forgery, or when
<a
href="https://docs.djangoproject.com/en/5.0/r ... ">Django’s
CSRF mechanism</a> has not been used correctly. For POST forms, you need to
ensure:</p>
<ul>
<li>Your browser is accepting cookies.</li>
<li>The view function passes a <code>request</code> to the template’s <a
href="https://docs.djangoproject.com/en/dev/t ... </code></a>
method.</li>
<li>In the template, there is a <code>{% csrf_token
%}</code> template tag inside each POST form that
targets an internal URL.</li>
<li>If you are not using <code>CsrfViewMiddleware</code>, then you must use
<code>csrf_protect</code> on any views that use the <code>csrf_token</code>
template tag, as well as those that accept the POST data.</li>
<li>The form has a valid CSRF token. After logging in in another browser
tab or hitting the back button after a login, you may need to reload the
page with the form, because the token is rotated after a login.</li>
</ul>
<p>You’re seeing the help section of this page because you have <code>DEBUG =
True</code> in your Django settings file. Change that to <code>False</code>,
and only the initial error message will be displayed. </p>
<p>You can customize this page using the CSRF_FAILURE_VIEW setting.</p>
</div>
</body>
</html>
Process finished with exit code 0
@sparrow
Eine REST API werde ich als Nächstes erstellen, da habe ich auch eine gutes Pycharm Beispiel gefunden.
- noisefloor
- User
- Beiträge: 3866
- Registriert: Mittwoch 17. Oktober 2007, 21:40
- Wohnort: WW
- Kontaktdaten:
Hallo,
Du kannst nicht "einfach so" POST Daten an die Route senden, da wird grundsätzlich der CSRF-Cookie erwartet.
Wenn du ein REST Framework auf Django drauf setzt wie das Django REST Framework oder Djano Ninja kümmert sich das um die Sicherheitssachen.
Gruß, noisefloor
Nein, was fehlt steht in der Fehlermeldung: Der Cookie zum Schutz gegen CSRF, den Django bei POST-Request an Routen, die mit HTML-Formularen arbeiten, erwartet. Wie man den bei Formularen setzt ist in der Django-Doku erklärt, was der CSRF Cookie macht ist in der Django-Doku erklärt. Siehe https://docs.djangoproject.com/en/5.0/howto/csrf/Fehlt noch ein log in?
Du kannst nicht "einfach so" POST Daten an die Route senden, da wird grundsätzlich der CSRF-Cookie erwartet.
Wenn du ein REST Framework auf Django drauf setzt wie das Django REST Framework oder Djano Ninja kümmert sich das um die Sicherheitssachen.
Gruß, noisefloor
- __blackjack__
- User
- Beiträge: 13163
- Registriert: Samstag 2. Juni 2018, 10:21
- Wohnort: 127.0.0.1
- Kontaktdaten:
@pumuckll: Datum und Zeit gehören in *einen* Wert, nicht auf zwei verteilt. Und sind das da etwa letzten Endes alles Freitext-Felder? Das wäre ungewöhnlich, weil fehleranfällig.
Das heisst zwar in relationalen Datenbanken auch Tabellen, wie in einer Tabellenkalkulation, das ist aber nicht dazu gedacht das so wie eine Excel-Tabelle zu benutzen.
Das heisst zwar in relationalen Datenbanken auch Tabellen, wie in einer Tabellenkalkulation, das ist aber nicht dazu gedacht das so wie eine Excel-Tabelle zu benutzen.
“There will always be things we wish to say in our programs that in all known languages can only be said poorly.” — Alan J. Perlis
Es hat einige Versuche gebraucht, aber mit dem Pycharm Django REST Tutorial habe ich es geschafft.
Ich habe jetzt Ansichten für die Rest API und für die Visualisierung im Tabellenformat.
https://blog.jetbrains.com/pycharm/2023 ... framework/
Den Code bisher hab ich zum Teil sogar verstanden
Für die Liste brauche ich noch Überschriften und eine Seite als Legende.
Die Tests mit Android-Geräten waren mühsam, aber das Auslesen des NFC-Tags und das Versenden der Postnachricht nach der Authentifizierung funktioniert.
Ich hatte Datum und Zeit getrennt, weil ich diesen Fehler hatte:
Die Meldung habe ich immer noch, aber es funktioniert.
Was meinst du damit?
Danke
Ich habe jetzt Ansichten für die Rest API und für die Visualisierung im Tabellenformat.
https://blog.jetbrains.com/pycharm/2023 ... framework/
Den Code bisher hab ich zum Teil sogar verstanden
Code: Alles auswählen
<h1>Alle durchgeführten Arbeiten und Kontrollen:</h1>
<table>
{% for item in object_list reversed %}
<tr>
<td>{{ item.get_location_display }}</td>
<td>{{ item.get_work_display }}</td>
<td>{{ item.text }}</td>
<td>{{ item.get_user_display }}</td>
<td>{{ item.created }}</td>
</tr>
class AllToDos(ListView):
model = Check
template_name = "Checkliste/index.html"
class MonthToDos(ListView):
model = Check
template_name = "Checkliste/month.html"
def get_queryset(self):
return Check.objects.filter(created__range=(datetime.today() + timedelta(days=-31), datetime.today()))
Die Tests mit Android-Geräten waren mühsam, aber das Auslesen des NFC-Tags und das Versenden der Postnachricht nach der Authentifizierung funktioniert.
@__blackjack____blackjack__ hat geschrieben: ↑Donnerstag 11. Januar 2024, 10:46 @pumuckll: Datum und Zeit gehören in *einen* Wert, nicht auf zwei verteilt. Und sind das da etwa letzten Endes alles Freitext-Felder? Das wäre ungewöhnlich, weil fehleranfällig.
Das heisst zwar in relationalen Datenbanken auch Tabellen, wie in einer Tabellenkalkulation, das ist aber nicht dazu gedacht das so wie eine Excel-Tabelle zu benutzen.
Ich hatte Datum und Zeit getrennt, weil ich diesen Fehler hatte:
Code: Alles auswählen
__init__.py:1654: RuntimeWarning: DateTimeField Check.created received a naive datetime (2023-10-17 19:29:13.138714) while time zone support is active.
Code: Alles auswählen
Das heisst zwar in relationalen Datenbanken auch Tabellen, wie in einer Tabellenkalkulation, das ist aber nicht dazu gedacht das so wie eine Excel-Tabelle zu benutzen.
Danke
- __blackjack__
- User
- Beiträge: 13163
- Registriert: Samstag 2. Juni 2018, 10:21
- Wohnort: 127.0.0.1
- Kontaktdaten:
@pumuckll: Das sieht halt so aus, dass da eine 2D-Tabelle mit lauter Freitextfeldern ist. Das ist aber falsch, weil man dafür keine relationale Datenbank (mis)braucht. Da steht beispielsweise bei Tätigkeit mal „reinigen” und mal „Reinigung“. Das sollte gar nicht in *der* Tabelle stehen, sondern die Tätigkeit sollte ein Fremdschlüssel sein in eine Tabelle mit den Tätigkeiten, damit da nichts redundant gespeichert wird, und jede Tätigkeit eindeutig ist.
“There will always be things we wish to say in our programs that in all known languages can only be said poorly.” — Alan J. Perlis
Das ist das komplette model
serializer
view
und index
sieht jetzt so aus:
Schiesse ich mit Kanonen auf Tauben?
Das Pycharm Beispiel war genau das, was ich brauchte.
Wie soll ich das dann angehen?
Code: Alles auswählen
from django.db import models
from django.db.models.functions import datetime
from django.utils.timezone import now
LOCATION_CHOICES = [
('K', 'Küche'),
('KV', 'Küche Vorraum'),
('KR', 'Kühlraum'),
('KR2', 'Kühlraum Küche'),
('L', 'Lager'),
('L2', 'Lager Zwei'),
('G', 'Gasträume'),
('GG', 'Gast Garten'),
('u1', 'Ungeziefer 1'),
('u2', 'Ungeziefer 2'),
('u3', 'Ungeziefer 3'),
('u4', 'Ungeziefer 4'),
('u5', 'Ungeziefer 5'),
('u6', 'Ungeziefer 6'),
('u7', 'Ungeziefer 7'),
('u8', 'Ungeziefer 8'),
('u9', 'Ungeziefer 9'),
('u10', 'Ungeziefer 10'),
]
WORK_CHOICES = [
('r', 'Gereinigt'),
('k', 'Kontrolliert'),
('f', 'frei'),
]
USER_CHOICES = {
'SM-A536B': 'Angestellter',
'yy-xxx': 'Angestellte',
'ww-xxx': 'Angestellt',
}
class Check(models.Model):
created = models.DateTimeField(auto_now_add=True)
location = models.CharField(choices=LOCATION_CHOICES, default='K', max_length=100)
work = models.CharField(choices=WORK_CHOICES, default='r', max_length=100)
text = models.TextField(default='')
author = models.ForeignKey('auth.User', related_name='Checks', on_delete=models.CASCADE)
user = models.CharField(choices=USER_CHOICES, default='ww-xxx', max_length=100, )
userid = models.TextField(default='', max_length=100)
# blank=True
def __str__(self):
return f"{self.user}: hat {self.location} {self.work}"
class Meta:
ordering = ['created']
Code: Alles auswählen
from rest_framework import serializers
from Checkliste.models import Check
from django.contrib.auth.models import User
class UserSerializer(serializers.ModelSerializer):
Checks = serializers.PrimaryKeyRelatedField(many=True, queryset=Check.objects.all())
class Meta:
model = User
fields = ['id', 'username', 'Checks']
class CheckSerializer(serializers.ModelSerializer):
author = serializers.ReadOnlyField(source='author.username')
class Meta:
model = Check
fields = ['id', 'created', 'location', 'work', 'text', 'author', 'user', 'userid']
Code: Alles auswählen
from rest_framework import generics
from Checkliste.models import Check
from Checkliste.serializers import CheckSerializer, UserSerializer
from django.contrib.auth.models import User
from rest_framework import permissions
from django.views.generic import ListView
from datetime import date, timedelta
from datetime import datetime
class UserList(generics.ListAPIView):
queryset = User.objects.all()
serializer_class = UserSerializer
permission_classes = [permissions.IsAuthenticatedOrReadOnly]
class UserDetails(generics.RetrieveAPIView):
queryset = User.objects.all()
serializer_class = UserSerializer
permission_classes = [permissions.IsAuthenticatedOrReadOnly]
class CheckList(generics.ListCreateAPIView):
queryset = Check.objects.all()
serializer_class = CheckSerializer
def perform_create(self, serializer):
serializer.save(author=self.request.user)
class CheckDetails(generics.RetrieveUpdateDestroyAPIView):
queryset = Check.objects.all()
serializer_class = CheckSerializer
class AllToDos(ListView):
model = Check
template_name = "Checkliste/index.html"
class WeekToDos(ListView):
model = Check
template_name = "Checkliste/week.html"
def get_queryset(self):
return Check.objects.filter(created__range=(datetime.today() + timedelta(hours=-32), datetime.today()))
class MonthToDos(ListView):
model = Check
template_name = "Checkliste/month.html"
def get_queryset(self):
return Check.objects.filter(created__range=(datetime.today() + timedelta(days=-31), datetime.today()))
class Month3ToDos(ListView):
model = Check
template_name = "Checkliste/month3.html"
def get_queryset(self):
return Check.objects.filter(created__range=(datetime.today() + timedelta(days=-90), datetime.today()))
Code: Alles auswählen
{% extends "base.html" %}
{% block content %}
<h1>Alle durchgeführten Arbeiten und Kontrollen:</h1>
<table>
<thead>
<tr>
<th>Ort</th>
<th>Tätigkeit</th>
<th>Kommentar</th>
<th>Benutzer</th>
<th>Datum & Uhrzeit</th>
</tr>
</thead>
{% for item in object_list reversed %}
<tr>
<td>{{ item.get_location_display }}</td>
<td>{{ item.get_work_display }}</td>
<td>{{ item.text }}</td>
<td>{{ item.get_user_display }}</td>
<td>{{ item.created }}</td>
</tr>
{% endfor %}
</table>
{% endblock %}
Schiesse ich mit Kanonen auf Tauben?
Das Pycharm Beispiel war genau das, was ich brauchte.
Wie soll ich das dann angehen?
- noisefloor
- User
- Beiträge: 3866
- Registriert: Mittwoch 17. Oktober 2007, 21:40
- Wohnort: WW
- Kontaktdaten:
Hallo,
bzgl. des Models: "CHOICES" im Modell definieren macht immer dann Sinn, wenn man sich sehr sicher ist, dass die Auswahlmöglichkeiten sich selten bis nie ändern. Klassisches Beispiel wäre z.B. Schuljahr (wir ja auch in der Django Doku genutzt). Bei allem anderen nimmer man bessere eine separate Tabelle dafür und dann eine Fremdschlüsselbeziehung. Bei dir wäre das IMHO auf jeden Fall bei `user` der Fall - davon ausgehend, dass man auf Jahres gesehen auf jeden Fall eine Fluktuation bei den Reinigungskräften hat. Bei `work` und `location` muss du das abschätzen, siehe oben.
Was auch immer userid ist -> klingt so, als sollte das auch kein Freitextfeld sein. Und was ist der Unterschied zwischen `user` und `userid` - sind das nicht redundante Informationen?
Textfelder mit einem leeren String vorbelegen kann man machen, ist aber selten sinnvoll. Entweder setzt man das Feld auf `None`, wenn nicht drin stehen darf (in Python sind None und ein leerer String _nicht_ das gleiche) oder man macht es zum Pflichtfeld.
Gruß, noisefloor
bzgl. des Models: "CHOICES" im Modell definieren macht immer dann Sinn, wenn man sich sehr sicher ist, dass die Auswahlmöglichkeiten sich selten bis nie ändern. Klassisches Beispiel wäre z.B. Schuljahr (wir ja auch in der Django Doku genutzt). Bei allem anderen nimmer man bessere eine separate Tabelle dafür und dann eine Fremdschlüsselbeziehung. Bei dir wäre das IMHO auf jeden Fall bei `user` der Fall - davon ausgehend, dass man auf Jahres gesehen auf jeden Fall eine Fluktuation bei den Reinigungskräften hat. Bei `work` und `location` muss du das abschätzen, siehe oben.
Was auch immer userid ist -> klingt so, als sollte das auch kein Freitextfeld sein. Und was ist der Unterschied zwischen `user` und `userid` - sind das nicht redundante Informationen?
Textfelder mit einem leeren String vorbelegen kann man machen, ist aber selten sinnvoll. Entweder setzt man das Feld auf `None`, wenn nicht drin stehen darf (in Python sind None und ein leerer String _nicht_ das gleiche) oder man macht es zum Pflichtfeld.
Gruß, noisefloor
Hallo,
Die Auswahl kann bzw. wird sich noch ändern.
Die Anwendung dient der Erfassung der nachweispflichtigen Kontrollen, via NFC Chips oder Eintragungen am Browser
Also Ort und Arbeit wird geändert und ergänzt.
Der Text ist als Kommentar gedacht, wenn ich den Eintrag manuell über den Browser erstelle oder eben zusätzliche Infos auf einem NFC Chip speichere.
User sind Daten, die das mobile Gerät sendet. Derzeit Marke und Geräte-ID eines Android-Handys. Diese ordne ich dann einen Namen zu.
Was von IOS kommt, muss ich noch testen.
Userid ist derzeit zum Testen bzw. Reserve.
Ich möchte auch eine Seite mit einer Legende zu den einzelnen Locations und Arbeiten erstellen.
Soll ich diese Daten in eine externe Tabelle ablegen und nicht in der Datenbank?
Wie kann das aussehen?
danke schon mal
Die Auswahl kann bzw. wird sich noch ändern.
Die Anwendung dient der Erfassung der nachweispflichtigen Kontrollen, via NFC Chips oder Eintragungen am Browser
Also Ort und Arbeit wird geändert und ergänzt.
Der Text ist als Kommentar gedacht, wenn ich den Eintrag manuell über den Browser erstelle oder eben zusätzliche Infos auf einem NFC Chip speichere.
User sind Daten, die das mobile Gerät sendet. Derzeit Marke und Geräte-ID eines Android-Handys. Diese ordne ich dann einen Namen zu.
Was von IOS kommt, muss ich noch testen.
Userid ist derzeit zum Testen bzw. Reserve.
Ich möchte auch eine Seite mit einer Legende zu den einzelnen Locations und Arbeiten erstellen.
Soll ich diese Daten in eine externe Tabelle ablegen und nicht in der Datenbank?
Wie kann das aussehen?
danke schon mal
Mit "Tabelle" ist eine Tabelle in der selben Datenbank gemeint.
Du hast eine Tabelle, die zu einer User-ID die User-Informationen speichert.
Du hast eine Tabelle, die zu einer Ort-ID alle Informationen zu diesem Ort speichert.
Und Du hast eine Tabelle, die zu einer Tätigkeits-ID mögliche Tätigkeiten speichert.
IDs sind dabei immer Zahlen.
In der Tabelle "Check" stehen dann nur noch User-ID, Ort-ID, Tätigkeit-ID, Erstelldatum und eventuell noch ein Kommentar (als Textfeld).
Du hast eine Tabelle, die zu einer User-ID die User-Informationen speichert.
Du hast eine Tabelle, die zu einer Ort-ID alle Informationen zu diesem Ort speichert.
Und Du hast eine Tabelle, die zu einer Tätigkeits-ID mögliche Tätigkeiten speichert.
IDs sind dabei immer Zahlen.
In der Tabelle "Check" stehen dann nur noch User-ID, Ort-ID, Tätigkeit-ID, Erstelldatum und eventuell noch ein Kommentar (als Textfeld).
So etwa?
https://docs.djangoproject.com/en/5.0/intro/tutorial02/
Question entspricht meinen Model und Choice eben die Auswahl?
Choice model dann drei mal?
https://docs.djangoproject.com/en/5.0/intro/tutorial02/
Code: Alles auswählen
rom django.db import models
class Question(models.Model):
question_text = models.CharField(max_length=200)
pub_date = models.DateTimeField("date published")
class Choice(models.Model):
question = models.ForeignKey(Question, on_delete=models.CASCADE)
choice_text = models.CharField(max_length=200)
votes = models.IntegerField(default=0)
Question entspricht meinen Model und Choice eben die Auswahl?
Choice model dann drei mal?
Hallo liebe Helfer,
Ich habe wieder von vorne angefangen und komme immer besser rein.
Ich nutze Bulma und ForeignKey.
https://bpa.st/NVOA
Dieser Code sieht nun so aus:
Die Grundfunktion, die ich benötige, funktioniert bereits.
Die Checkliste ist ausgewählt, ich gebe den Objektort an, was geprüft werden soll usw.
Als nächstes möchte ich den Objektort anhand der Checkliste filtern.
z.B. Boden Wände Decke soll nur für Liste A auswählbar sein.
Die Steigerung da von ist das nur Objektorte auswählbar sind, die seit x Tagen nicht geprüft wurden.
Kann ich das über die Admin-Seite machen oder muss ich dafür eigene Formulare erstellen und per httpREST übermitteln?
Ich habe noch ein ungelöstes Problem:
Mit dem CSV-Export erhalte ich diese Daten:
Wenn ich die gleichen Daten erneut importiere, erhalte ich diese Fehlermeldung:
Im Moment weiß ich nicht, wie ich diesen Fehler finden kann.
Bitte um Hilfe
Danke im Voraus
Gruss Gerhard
Ich habe wieder von vorne angefangen und komme immer besser rein.
Ich nutze Bulma und ForeignKey.
https://bpa.st/NVOA
Dieser Code sieht nun so aus:
Die Grundfunktion, die ich benötige, funktioniert bereits.
Die Checkliste ist ausgewählt, ich gebe den Objektort an, was geprüft werden soll usw.
Als nächstes möchte ich den Objektort anhand der Checkliste filtern.
z.B. Boden Wände Decke soll nur für Liste A auswählbar sein.
Die Steigerung da von ist das nur Objektorte auswählbar sind, die seit x Tagen nicht geprüft wurden.
Kann ich das über die Admin-Seite machen oder muss ich dafür eigene Formulare erstellen und per httpREST übermitteln?
Ich habe noch ein ungelöstes Problem:
Mit dem CSV-Export erhalte ich diese Daten:
Code: Alles auswählen
checkliste,objektort,pruefpunkt,ok,mangel,frist,behoben,von
Checkliste A,Boden Wände Decke,sauber,1,,,2024-03-18 13:25:59+00:00,Gerhard
Im Moment weiß ich nicht, wie ich diesen Fehler finden kann.
Bitte um Hilfe
Danke im Voraus
Gruss Gerhard