so langsam komme ich immer besser zurecht mit der Funktionsweise von Django. Die ersten Anforderungen konnte ich bereits erfolgreich umsetzen. Nun habe ich ein Template verantwortlichkeit.html, auf dem ich quasi einen einzelnen Datensatz aus meinem Verantwortlichkeit Model darstelle. An dieser einen Verantwortlichkeit können mehrere Probleme hängen. Diese befinden sich im Problem Model und das Model hat die Verantwortlichkeit als FK enthalten. Ebenfalls hängt ein Status 1:1 an einer Verantwortlichkeit (Model Status). Ich schaffe es den Status zusätzlich im Template über verantwortlichkeit.status.ampel anzuzeigen, aber nicht die Probleme. Könnt ihr mir hier mal auf die Sprünge helfen.
Auszug models.py:
Code: Alles auswählen
class Verantwortlichkeit(models.Model):
projekt = models.ForeignKey(Projekt, on_delete=models.CASCADE)
baugruppe = models.ForeignKey(Baugruppe, on_delete=models.CASCADE)
abteilung = models.ForeignKey(Abteilung, on_delete=models.CASCADE)
mitarbeiter = models.ForeignKey(Mitarbeiter, on_delete=models.SET_NULL, blank=True, null=True)
erstellt_am = models.DateTimeField(auto_now_add=True, editable=False)
geaendert_am = models.DateTimeField(auto_now=True, editable=False)
class Meta:
verbose_name_plural = 'Verantwortlichkeiten'
constraints = [
models.UniqueConstraint(fields=['projekt', 'baugruppe', 'abteilung', 'mitarbeiter'], name='uq_projekt_baugruppe_abteilung_mitarbeiter')
]
def __str__(self):
return f'{self.projekt} | {self.baugruppe} | {self.abteilung} | {self.mitarbeiter}'
def get_absolute_url(self):
return reverse('verantwortlichkeit', kwargs={'pk': self.pk})
class Problem(models.Model):
verantwortlichkeit = models.ForeignKey(Verantwortlichkeit, on_delete=models.CASCADE)
beschreibung = models.TextField()
ist_geloest = models.BooleanField(verbose_name='gelöst', default=False)
erstellt_am = models.DateTimeField(auto_now_add=True, editable=False)
geaendert_am = models.DateTimeField(auto_now=True, editable=False)
class Meta:
verbose_name_plural = 'Probleme'
def __str__(self):
return f'{self.verantwortlichkeit} | {self.beschreibung[:50]}'
class Status(models.Model):
FARBEN = (
('Rot', 'Rot'),
('Gelb', 'Gelb'),
('Grün', 'Grün'),
)
verantwortlichkeit = models.OneToOneField(Verantwortlichkeit, on_delete=models.CASCADE, unique=True)
ampel = models.CharField(max_length=4, choices=FARBEN, default='Grün')
erstellt_am = models.DateTimeField(auto_now_add=True, editable=False)
geaendert_am = models.DateTimeField(auto_now=True, editable=False)
class Meta:
verbose_name_plural = 'Status'
def __str__(self):
return self.ampel
Code: Alles auswählen
from django.shortcuts import render
from django.views.generic import DetailView
from django.views.generic.edit import CreateView, UpdateView, DeleteView
from django.urls import reverse_lazy
from .models import Verantwortlichkeit
from .filters import VerantwortlichkeitFilter
def verantwortlichkeiten(request):
verantwortlichkeiten = Verantwortlichkeit.objects.all()
verantwortlichkeiten_filter = VerantwortlichkeitFilter(request.GET, queryset=verantwortlichkeiten)
verantwortlichkeiten = verantwortlichkeiten_filter.qs
context = {'verantwortlichkeiten': verantwortlichkeiten, 'verantwortlichkeiten_filter': verantwortlichkeiten_filter}
return render(request, 'verantwortlichkeiten.html', context)
class VerantwortlichkeitDetailView(DetailView):
model = Verantwortlichkeit
template_name = 'verantwortlichkeit.html'
Code: Alles auswählen
from django.urls import path
from .views import verantwortlichkeiten, VerantwortlichkeitDetailView, VerantwortlichkeitCreateView, VerantwortlichkeitUpdateView, VerantwortlichkeitDeleteView
urlpatterns = [
path('bgr-cockpit/verantwortlichkeiten', verantwortlichkeiten, name="verantwortlichkeiten"),
path('bgr-cockpit/verantwortlichkeit/<int:pk>/', VerantwortlichkeitDetailView.as_view(), name="verantwortlichkeit"),
path('bgr-cockpit/verantwortlichkeit/erstellen/', VerantwortlichkeitCreateView.as_view(), name="verantwortlichkeit_erstellen"),
path('bgr-cockpit/verantwortlichkeit/<int:pk>/bearbeiten/', VerantwortlichkeitUpdateView.as_view(), name="verantwortlichkeit_bearbeiten"),
path('bgr-cockpit/verantwortlichkeit/<int:pk>/loeschen/', VerantwortlichkeitDeleteView.as_view(), name="verantwortlichkeit_loeschen"),
]
Code: Alles auswählen
{% extends 'base.html' %}
{% block content %}
<div class="container">
<table class="table table-light table-striped">
<thead>
<tr>
<th>PROJEKT</th>
<th>BAUGRUPPE</th>
<th>ABTEILUNG</th>
<th>MITARBEITER</th>
<th>STATUS</th>
<th>BEARBEITEN</th>
<th>LÖSCHEN</th>
</tr>
</thead>
<tbody class="table-group-divider">
<tr>
<td>{{ verantwortlichkeit.projekt }}</td>
<td>{{ verantwortlichkeit.baugruppe }}</td>
<td>{{ verantwortlichkeit.abteilung }}</td>
<td>{{ verantwortlichkeit.mitarbeiter }}</td>
<td>{{ verantwortlichkeit.status.ampel }}</td>
<td><a href="{% url 'verantwortlichkeit_bearbeiten' verantwortlichkeit.pk %}">Verantwortlichkeit bearbeiten</a></td>
<td><a href="{% url 'verantwortlichkeit_loeschen' verantwortlichkeit.pk %}">Verantwortlichkeit löschen</a></td>
</tr>
</tbody>
</table>
</div>
{% endblock content %}
Viele Grüße
gospat