Ansatz zu neuem Projekt

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
pumuckll
User
Beiträge: 56
Registriert: Donnerstag 30. August 2018, 17:45

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
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

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.
Benutzeravatar
noisefloor
User
Beiträge: 3856
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
pumuckll
User
Beiträge: 56
Registriert: Donnerstag 30. August 2018, 17:45

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.
Benutzeravatar
noisefloor
User
Beiträge: 3856
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
pumuckll
User
Beiträge: 56
Registriert: Donnerstag 30. August 2018, 17:45

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.

Bild

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}"
views.py

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())
index.py

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 %}
Über die Admin-Seite kann ich die Einträge bearbeiten:
Bild

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
Benutzeravatar
sparrow
User
Beiträge: 4195
Registriert: Freitag 17. April 2009, 10:28

Recherchier mal bitte, was eine REST API Ist.
Benutzeravatar
noisefloor
User
Beiträge: 3856
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
pumuckll
User
Beiträge: 56
Registriert: Donnerstag 30. August 2018, 17:45

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
Genau das meiste ist fertig, ich muss am Ende über mobile Geräte Einträge hinzufügen.

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>
edit:

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)
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
Fehlt noch ein log in?

@sparrow

Eine REST API werde ich als Nächstes erstellen, da habe ich auch eine gutes Pycharm Beispiel gefunden.
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,
Fehlt noch ein log in?
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/

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
Benutzeravatar
__blackjack__
User
Beiträge: 13117
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.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
pumuckll
User
Beiträge: 56
Registriert: Donnerstag 30. August 2018, 17:45

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/


Bild
Bild

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()))
       
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.

__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.
@__blackjack__

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.
Die Meldung habe ich immer noch, aber es funktioniert.

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.
Was meinst du damit?



Danke
Benutzeravatar
__blackjack__
User
Beiträge: 13117
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.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
pumuckll
User
Beiträge: 56
Registriert: Donnerstag 30. August 2018, 17:45

Das ist das komplette model

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']
serializer

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']
view

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()))
und index

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 %}
sieht jetzt so aus:
Bild

Schiesse ich mit Kanonen auf Tauben?

Das Pycharm Beispiel war genau das, was ich brauchte.

Wie soll ich das dann angehen?
Benutzeravatar
noisefloor
User
Beiträge: 3856
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
pumuckll
User
Beiträge: 56
Registriert: Donnerstag 30. August 2018, 17:45

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
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

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).
pumuckll
User
Beiträge: 56
Registriert: Donnerstag 30. August 2018, 17:45

So etwa?


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?
pumuckll
User
Beiträge: 56
Registriert: Donnerstag 30. August 2018, 17:45

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:
Bild
Bild
Bild
Bild

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
Wenn ich die gleichen Daten erneut importiere, erhalte ich diese Fehlermeldung:

Bild
Bild

Im Moment weiß ich nicht, wie ich diesen Fehler finden kann.

Bitte um Hilfe
Danke im Voraus
Gruss Gerhard
Benutzeravatar
sparrow
User
Beiträge: 4195
Registriert: Freitag 17. April 2009, 10:28

Die Fehlermeldung sagt: Du versuchst irgendwo `'1'` zu übergeben (also eine Zeichenkette mit einem einzigen Zeichen: 1), wo eigentlich die Instanz des Models "Checkliste" erwartet wird.
Antworten