Seite 1 von 1
django-service-objects mit Parametern
Verfasst: Freitag 19. August 2022, 09:04
von efix
Hallo,
ich komm gerade nicht weiter und ich finde nichts darüber. Ich würde gerne django-service-objects
benutzen... oder besser gesagt ich bin schon dabei. Aber ich weiss nicht wie ich den service Parameter übergebe...
view.py
Code: Alles auswählen
@csrf_exempt
def start(request, **user_id):
if user_id:
uid = user_id
else:
uid = {"user_id": "test"}
"""ich weiss nicht ob das so richtig ist und wenn ja wie ich im service auf uid zugreife """
context = GetBookingService.execute({'uid': uid['user_id']})
if request.method == 'POST':
data = dict(request.POST)
#b.insert_booking(uid['user_id'], data)
return redirect('/start/' + uid['user_id'])
ctj = {'data': json.dumps(context)}
return render(request, "index.html", ctj)
service Datei
Code: Alles auswählen
class GetBookingService(Service):
uid = ''
def process(self):
#self.uid = Service.
return self.get_from_user(self.uid)
# data = db.selectTest()
# for row in data.iterator():
# print(row.user)
Vielen Dank schonmal für jede Hilfe
Re: django-service-objects mit Parametern
Verfasst: Freitag 19. August 2022, 12:03
von efix
Ich habe das jetzt so gemacht. Aber jetzt habe ich das Problem dass die execute funktion einen input erwartet..
ist es nicht das Selbe wenn ich einfach process aufrufe?
Ich habe leider darüber nichts finden können. Ich habe nur etwas gefunden das die execute funktion sicherstellen soll das process aufgerufen wird und ggf. Fehler ausgeben soll...
Code: Alles auswählen
class GetBookingService(Service):
uid = ''
def process(self):
return self.get_from_user()
...
Code: Alles auswählen
def start(request, **user_id):
if user_id:
uid = user_id
else:
uid = {"user_id": "test"}
getbooking = GetBookingService()
getbooking.uid = uid['user_id']
context = getbooking.process()
...
Re: django-service-objects mit Parametern
Verfasst: Freitag 19. August 2022, 12:31
von __blackjack__
@efix: Wenn das ein Problem ist das `execute()` ein Argument erwartet und wenn Du auf dem abgeleiteten `Service`-Objekt gar keine Django-Forms Attribute definierst, dann stellt sich die Frage warum Du überhaupt ein `Service`-Objekt verwenden willst, von dem Du am Ende nichts verwendest. Das macht keinen Sinn.
Es ist natürlich nicht das selbe statt `execute()` direkt `process()` aufzurufen. `execute()` macht mehr als nur das. Und da auch wieder: wenn Du nicht weisst was das macht, und es deswegen einfach nicht benutzt, also letztlich *gar nichts* von `Service` oder `Form` benutzt, dann ist das hochgradig sinnbefreit überhaupt `Service` zu verwenden.
Re: django-service-objects mit Parametern
Verfasst: Freitag 19. August 2022, 12:35
von efix
Was sind denn Form-Attribute?
Re: django-service-objects mit Parametern
Verfasst: Freitag 19. August 2022, 12:39
von efix
so?
Code: Alles auswählen
def start(request, **user_id):
if user_id:
uid = user_id
else:
uid = {"user_id": "test"}
context = GetBookingService.execute({'uid': uid['user_id']})
Code: Alles auswählen
class GetBookingService(Service):
uid = forms.CharField()
def process(self):
return self.get_from_user()
Re: django-service-objects mit Parametern
Verfasst: Freitag 19. August 2022, 12:40
von efix
Aber dann bekomme ich einen Fehler:
AttributeError: 'GetBookingService' object has no attribute 'uid'
Re: django-service-objects mit Parametern
Verfasst: Freitag 19. August 2022, 13:09
von efix
ok so gehts.
Ist das denn so richtig?
Code: Alles auswählen
class GetBookingService(Service):
uid = forms.CharField()
def process(self):
self.uid = self.cleaned_data['uid']
return self.get_from_user()
Code: Alles auswählen
def start(request, **user_id):
if user_id:
uid = user_id
else:
uid = {"user_id": "test"}
context = GetBookingService.execute({'uid': uid['user_id']})
Ruft man denn so einen Service auf oder muss ich ein Objekt erstellen?
Re: django-service-objects mit Parametern
Verfasst: Freitag 19. August 2022, 13:55
von __blackjack__
@efix: Man sollte ausserhalb der `__init__()` keine Attribute einführen. Wenn `get_from_user()` die UID braucht, muss die halt als Argument übergeben werden oder vielleicht besser gar keine zusätzliche Methode sein, sondern einfach der Inhalt der `process()`-Methode. Ein `Service`-Objekt ist ein kompliziert geschriebene Funktion deren Funktionskörper in `process()` gehört, wobei die Argumente aus `self.cleaned_data` kommen, die mit `execute()` aufgerufen wird, mit *einem* Argument, einem Wörterbuch, wo die Argumente drin stehen, die gegen die definierten Form-Felder validiert werden. Also letztlich nur ein superhässlicher Weg ein Funktionsargument das ein Wörterbuch sein muss, gegen Form-Felder zu validieren. Und es geht wirklich um die Validierung des einzigen Arguments in Wörterbuch-Form, denn die Begründung in der Dokumentation Logik von Views und Models zu trennen würde eine einfache normale Funktion ohne diesen `Service`/`Form`-Objekt-Quatsch genau so gut erfüllen.
Code: Alles auswählen
def start(request, user_id="test"):
context = get_from_user(user_id)
...