Hallo,
Entschuldigung erst einmal für meine späte Rückmeldung, aber ich habe in den letzten Wochen versucht mein Wissen über Django zu erweitern. Ich habe also noch einmal komplett von vorne angefangen und mich versucht auch an der Doku von djangoproject zu orientieren. Viele Dinge sind mir dabei viel bewusster geworden. Bei diesem Problem bin ich aber wieder angekommen.
Ich schildere noch einmal detailliert die Ausgangslage. Meine URLs sehen wie folgt aus:
Code: Alles auswählen
urlpatterns = [
path('', views.responsibilities_overview, name='responsibilities-overview'),
path('responsibility-details/<int:id>/', views.responsibility_details, name='responsibility-details'),
]
Ich kann also die Details einer Verantwortlichkeit (responsibility) über den View
responsibility_details erreichen. Dafür gebe ich ja die
ID als Parameter mit. Nehmen wir mal an ich befinde mich nun auf der Seite
.../responsibility-details/1/. Auf dieser Seite soll der User jetzt die Möglichkeit haben Probleme und Lösungen zu erfassen, jeweils über ein eigenes Formular. Für die Anlage eines Problems wird die ID des
Responsibility model benötigt (die 1 aus der URL). Für die spätere Anlage einer Lösung zu diesem Problem benötige ich wiederum die ID des Problems.
Wie und an welcher Stelle reiche ich diese Informationen jetzt am besten an die Formulare weiter? Meine views.py Datei (nur der relevante Ausschnitt) sieht wie folgt aus:
Code: Alles auswählen
def responsibility_details(request, id):
responsibility = get_object_or_404(Responsibility, id=id)
bottleneck_parts = BottleneckPart.objects.filter(cost_bearer=responsibility.project.cost_bearer).filter(department=responsibility.team.department.name). \
filter(system=responsibility.system.number)
drawings = Drawing.objects.filter(cost_bearer=responsibility.project.cost_bearer).filter(department=responsibility.team.department.name). \
filter(system=responsibility.system.number).order_by('drawing_number').values()
drawings_filter = DrawingFilter(request.GET, queryset=drawings)
drawings = drawings_filter.qs
drawings_visibility = Drawing.objects.filter(cost_bearer=responsibility.project.cost_bearer).filter(department=responsibility.team.department.name). \
filter(system=responsibility.system.number).order_by('drawing_number').values()
project_rounds = Meeting.objects.filter(cost_bearer=responsibility.project.cost_bearer).filter(system=responsibility.system.number). \
filter(title='Projektrunde').order_by('description', 'subject', 'item', 'date', 'responsibility').values()
working_meetings = Meeting.objects.filter(cost_bearer=responsibility.project.cost_bearer).filter(system=responsibility.system.number). \
filter(title='Working Meeting').order_by('description', 'subject', 'item', 'date', 'responsibility').values()
context = {'responsibility': responsibility, 'bottleneck_parts': bottleneck_parts, 'drawings': drawings \
, 'project_rounds': project_rounds, 'working_meetings': working_meetings, 'drawings_filter': drawings_filter \
, 'drawings_visibility': drawings_visibility}
return render(request, 'systemcockpit/responsibility_details.html', context)
Das Formular für das Problem habe ich noch nicht "richtig" erstellt, es dient also eher als Beispiel:
Code: Alles auswählen
from django import forms
class ProblemForm(forms.Form):
# responsibility_id (wie bekomme ich diese ID ins Formular?)
summary = forms.CharField()
description = forms.CharField()
Der relevante Part der models.py sieht wie folgt aus:
Code: Alles auswählen
class Problem(models.Model):
responsibility = models.ForeignKey(Responsibility, on_delete=models.CASCADE, verbose_name='Verantwortlichkeit', related_name='problems')
summary = models.CharField(max_length=150, verbose_name='Zusammenfassung')
description = models.TextField(verbose_name='Beschreibung')
created_at = models.DateTimeField(auto_now_add=True, editable=False, blank=True, verbose_name='Erstelldatum')
updated_at = models.DateTimeField(auto_now=True, editable=False, blank=True, verbose_name='Änderungsdatum')
user = models.ForeignKey('auth.User', on_delete=models.SET_DEFAULT, default=1, editable=False, verbose_name='Ersteller / Änderer')
class Meta:
verbose_name = 'Problem'
verbose_name_plural = 'Probleme'
def __str__(self):
return f'{self.responsibility} | {self.summary}'
class Solution(models.Model):
problem = models.OneToOneField(Problem, on_delete=models.CASCADE, verbose_name='Problem', related_name='solutions')
summary = models.CharField(max_length=150, verbose_name='Zusammenfassung')
description = models.TextField(verbose_name='Beschreibung')
created_at = models.DateTimeField(auto_now_add=True, editable=False, blank=True, verbose_name='Erstelldatum')
updated_at = models.DateTimeField(auto_now=True, editable=False, blank=True, verbose_name='Änderungsdatum')
user = models.ForeignKey('auth.User', on_delete=models.SET_DEFAULT, default=1, editable=False, verbose_name='Ersteller / Änderer')
class Meta:
verbose_name = 'Maßnahme'
verbose_name_plural = 'Maßnahmen'
def __str__(self):
return f'{self.problem} | {self.summary}'
Ich stelle mir es so vor, dass ich in meinem Template Buttons anlege, einer "Problem erstellen" und einer "Lösung erstellen". Klickt man auf einen der beiden, soll man zum entsprechenden Formular gelangen, sprich zu einem eigenen Template dafür.
Nach dem Erstellen eines Problems bzw. einer Lösung soll man zurück zur ursprünglichen URL gelangen (die oben genannte URL).
Für ein paar konkrete Tipps wäre ich wirklich sehr dankbar. Ich bin "leider" immer noch am Anfang meiner "Programmierkarriere", bitte seht mir also nach, wenn mich der Verweis auf die Doku oder ähnliches nicht immer weiterbringt. Vieles davon ist für einen Anfänger auch nach dem Durchlesen immer noch sehr schwierig zu verstehen, wenn man damit nicht täglich zu tun hat. Sollten Infos fehlen, liefere ich diese natürlich gerne nach.
Viele Grüße
gospat