django.urls.exceptions.NoReverseMatch: Reverse for 'seed_delete' with arguments '('',)' not found.

Django, Flask, Bottle, WSGI, CGI…
Antworten
gomez72
User
Beiträge: 71
Registriert: Sonntag 28. März 2021, 09:57

Ich verzweifle seit Tagen an folgendem Fehler:

Code: Alles auswählen

django.urls.exceptions.NoReverseMatch: Reverse for 'seed_delete' with arguments '('',)' not found. 1 pattern(s) tried: ['seed/(?P<pk>[0-9]+)/delete/\\Z']
Ich habe 3 Apps in meinem Projekt: main, plant und seed.
In der plant app erstellte ich erfolgreich ein CRUD Schema. Planzen werden erstellt, geändert, detailiert angezeigt und gelöscht.

Dies wollte ich nun mit Saat Daten in der seed app genauso machen, natürlich mit einem unterschiedlichen Daten model. In der plant app funktioniert alles prima. Der fast identische code in der seed funktioniert nur bei dem Anzeigen der ListView, aber nicht bei der Detailansicht, da wird der Fehler (NoReverseMatch) geworfen.

Ich habe alle urls, settings usw schon mehrfach kontrolliert. recherche im netz ergab einige treffer, aber ich konnte den fehler dennoch in meinem code nicht identifizieren.

Grundsätzlich:
Ich erzeuge mit einer seed_list.html eine Liste von Saat Daten. die ID kann man anklicken, und wird zur Detail Ansicht des Datensatzes geführt.
Wenn ich in der seed_list die ID eines Datensatzes anklicke, kommt der Fehler. Mir kommt es vor, als würden der DetailView überhaupt keine Daten übergeben. Ich verstehe es einfach nicht - bin mitterweile verzweifelt :-(

Hier mein code:

seed/models.py

Code: Alles auswählen

from django.db import models
from plant.models import Plant
from django.contrib.auth.models import User
from django.urls import reverse


class SeedingProcess(models.Model):
    seeding_date = models.DateField(blank=True, null=True)
    confirm_seed = models.IntegerField()
    planting_date = models.DateField(blank=True, null=True)
    forecast_harvest = models.DateField(blank=True, null=True)
    harvested_begin_date = models.DateField(blank=True, null=True)
    harvested_end_date = models.DateField(blank=True, null=True)
    fertilize_first_after_seeding = models.PositiveSmallIntegerField(blank=True, null=True)
    fertilize_interval = models.PositiveSmallIntegerField(blank=True, null=True)
    quantity_vegetables = models.PositiveIntegerField(blank=True, null=True)
    personal_records = models.CharField(max_length=500, blank=True, null=True)
    plant = models.ForeignKey(Plant, models.DO_NOTHING, db_column='plant', blank=True, null=True)
    old_user_delete_in_future = models.PositiveIntegerField(blank=True, null=True)
    user = models.ForeignKey(User, on_delete=models.CASCADE, default=2)

    def __str__(self):
        print_name = str(self.user) + " | " + str(self.plant)
        return print_name

    def get_absolute_url(self):
        return reverse('seed:seed_detail', args=[str(self.id)])

    class Meta:
        managed = True
        db_table = 'seeding_process'
seed/views.py

Code: Alles auswählen

from django.shortcuts import render

from seed.models import SeedingProcess
from django.urls import reverse_lazy, NoReverseMatch
from django.views.generic import ListView, CreateView, DetailView, UpdateView, DeleteView


class SeedList(ListView):
    model = SeedingProcess
    template_name = 'seed/seed_list.html'

    def get_queryset(self):
        order_by_seed = self.model.objects.order_by('seeding_date')
        return order_by_seed


class SeedCreate(CreateView):
    model = SeedingProcess
    template_name = 'seed/seed_create.html'
    fields = '__all__'
    success_url = reverse_lazy('seed:seed_list')


class SeedDetail(DetailView):
    model = SeedingProcess
    template_name = 'seed/seed_detail.html'


class SeedUpdate(UpdateView):
    model = SeedingProcess
    template_name = 'seed/seed_update.html'
    fields = '__all__'
    #success_url = reverse_lazy('seed:seed_list')


class SeedDelete(DeleteView):
    model = SeedingProcess
    template_name = 'seed/seed_delete.html'
    success_url = reverse_lazy('seed:seed_list')


seed/urls.py

Code: Alles auswählen

from django.urls import path
from . import views

app_name = 'seed'
urlpatterns = [

    path('list/', views.SeedList.as_view(), name='seed_list'),
    path('new/', views.SeedCreate.as_view(), name='seed_create'),
    path('<int:pk>', views.SeedDetail.as_view(), name='seed_detail'),
    path('<int:pk>/update/', views.SeedUpdate.as_view(), name='seed_update'),
    path('<int:pk>/delete/', views.SeedDelete.as_view(), name='seed_delete'),


]

seed/templates/seed/seed_list.html.py

Code: Alles auswählen

{% extends 'main/base.html' %}
{% load django_bootstrap5 %}

{% block content %}


<div class="container">
    <div class="row">
        <div class="col-1">
            <a href="{% url 'main:dashboard' %}" class="btn btn-dark btn-sm">Dashboard</a>
        </div>

        <div class="col-1">
                <a href="{% url 'plant:plant_list_name' %}" class="btn btn-dark btn-sm">Pflanzenliste</a>
            </div>
        <div class="col-1">
            <a href="{% url 'seed:seed_list' %}" class="btn btn-dark btn-sm">Saatliste</a>
        </div>
    </div>
</div>
<div class="container-fluids py-5 px-5">
    <div class="row" >
        <div class="col" >
            <h2>Alle Saaten</h2>
        </div>
        <div class="col-6" >

        </div>
        <div class="col-1" >
            <a class="btn btn-success btn-sm" href="{% url 'seed:seed_create' %}">+ Neue Saat hinzufügen</a>
        </div>
    </div>

    <table class="table table-striped table-hover table-bordered table-sm">
             <!--<table class="table table-dark table-striped">-->
              <thead>
              <!-- <tr class="table-success">
                    <th scope="col"></th>
                    <th scope="col"></th>
                    <th scope="col"></th>
                    <th scope="col"></th>
                    <th scope="col"></th>
                    <th scope="col"></th>
                    <th scope="col"></th>
                    <th scope="col"></th>
                    <th scope="col"></th>
                    <th scope="col"></th>
                    <th scope="col"></th>
                    <th scope="col"></th>
                </tr>-->
                <tr class="table-success">
                    <th scope="col">ID</th>
                    <th scope="col">Art</th>
                    <th scope="col">Sorte</th>
                    <th scope="col">Aussaat</th>
                    <!--<th scope="col">bestätigt</th> -->
                    <th scope="col">Auspflanzen</th>
                    <th scope="col">ca. Ernte</th>
                    <th scope="col">von</th>
                    <th scope="col">bis</th>
                    <th scope="col">Anzahl</th>
                    <th scope="col">persönliche Notiz</th>
                    <th scope="col">Gärtner*in</th>
                </tr>
              </thead>
        {% for seed in object_list %}
            <tbody>
            <tr>
                    {% if seed.confirm_seed == 1 %}
                        <th scope="row" class="bg-success">
                        <a href="{% url 'seed:seed_detail' seed.pk %}" class="link-light">{{ seed.id }}</a>
                        </th>

                    {% else %}
                        <th scope="row">
                        <a href="{% url 'seed:seed_detail' seed.pk %}">{{ seed.id }}</a>
                        </th>
                    {% endif %}

                    <td>{{ seed.plant.species}}</td>
                    <td>{{ seed.plant.species_variety}}</td>
                    <td>{{ seed.seeding_date|date:"d.m.Y"}}</td>
                   <!-- <td>{{ seed.confirm_seed }}</td> -->
                    <td>{{ seed.planting_date|date:"d.m.Y" }}</td>
                    <td>{{ seed.forecast_harvest|date:"d.m.Y" }}</td>
                    <td>{{ seed.harvested_begin_date|date:"d.m.Y" }}</td>
                    <td>{{ seed.harvested_end_date|date:"d.m.Y" }}</td>
                    <td>{{ seed.quantity_vegetables }}</td>
                    {% if not seed.personal_records %}
                        <td></td>
                    {% else %}
                        <td>{{ seed.personal_records}}</td>
                    {% endif %}
                        <td>{{ seed.user}}</td>


             </tr>
             </tbody>
        {% endfor %}

    </table>



    <a class="btn btn-success btn-sm" href="{% url 'seed:seed_create' %}">+ Neue Pflanze hinzufügen</a>

</div>
{% endblock content %}

seed/templates/seed_detail.html

Code: Alles auswählen

{% extends 'main/base.html' %}
{% load django_bootstrap5 %}

{% block content %}

    <!-- Part 1 Title-->
    <div class="container py-4">
        <h2>Detail: <br> {{seed.confirm_seed}}</h2>

    </div>

    <!-- Part 1 Bezeichnung-->
    <div class="container py-2">
    <hr><br>
    <b>Bezeichnungen</b>
        <div class="row" >
            <div class="col-2" >
              ID:
            </div>
            <div class="col-10">
              {{seed.id}}
            </div>
        </div>

        <div class="row">
            <div class="col-2">
              Art:
            </div>
            <div class="col-10">

            </div>
        </div>

        <div class="row">
            <div class="col-2">
                Sorte:
            </div>
            <div class="col-10">

            </div>
        </div>

        <div class="row">
            <div class="col-2">
                Gattung:
            </div>
            <div class="col-10">

            </div>
        </div>

        <div class="row">
            <div class="col-2">
              Familie:
            </div>
            <div class="col-10">

            </div>
        </div>
    </div>

    <!-- Part 2 Wissenschaftliche Bezeichnung -->
    <div class="container py-3">
        <b>Wissenschaftliche Bezeichnungen</b>
        <div class="row">
            <div class="col-2">
              Art:
            </div>
            <div class="col-10">

            </div>
        </div>

        <div class="row">
            <div class="col-2">
                Sorte:
            </div>
            <div class="col-10">

            </div>
        </div>

        <div class="row">
            <div class="col-2">
                Gattung:
            </div>
            <div class="col-10">

            </div>
        </div>

        <div class="row">
            <div class="col-2">
              Familie:
            </div>
            <div class="col-10">

            </div>
        </div>
    </div>

    <!-- Part 3 Saat Infos-->
    <div class="container py-3">
        <b>Saat Infos</b>
        <div class="row">
            <div class="col-2">
              Keimtemperaturen:
            </div>
            <div class="col-10">

            </div>
        </div>

        <div class="row">
            <div class="col-2">
                Keimdauer:
            </div>
            <div class="col-10">

            </div>
        </div>

        <div class="row">
            <div class="col-2">
                PH Wert:
            </div>
            <div class="col-10">

            </div>
        </div>

        <div class="row">
            <div class="col-2">
              Saattiefe:
            </div>
            <div class="col-10">

            </div>
        </div>

        <div class="row">
            <div class="col-2">
              Pflanzenabstand:
            </div>
            <div class="col-10">

            </div>
        </div>

        <div class="row">
            <div class="col-2">
              Reihenabstand:
            </div>
            <div class="col-10">

            </div>
        </div>

        <div class="row">
            <div class="col-2">
              Wuchshöhe:
            </div>
            <div class="col-10">

            </div>
        </div>
    </div>

    <!-- Part 4 Pflanzen Bedarf-->
    <div class="container py-3">
        <b>Pflanzen Bedarf</b>
        <div class="row">
            <div class="col-2">
              Lichtbedarf:
            </div>
            <div class="col-10">

            </div>
        </div>

        <div class="row">
            <div class="col-2">
              Wasserbedarf:
            </div>
            <div class="col-10">

            </div>
        </div>

        <div class="row">
            <div class="col-2">
              Nährstoffbedarf:
            </div>
            <div class="col-10">

            </div>
        </div>

        <div class="row">
            <div class="col-2">
              1. Düngen nach:
            </div>
            <div class="col-10">

            </div>
        </div>

        <div class="row">
            <div class="col-2">
              Düngen Intervall:
            </div>
            <div class="col-10">

            </div>
        </div>
    </div>

    <!-- Part 5 Saat Zeiten-->
    <div class="container py-3">
        <b>Saat Zeiten</b>
        <div class="row">
            <div class="col-2">
              Aussaat:
            </div>
            <div class="col-10">

            </div>
        </div>

        <div class="row">
            <div class="col-2">
              Auspflanzen:
            </div>
            <div class="col-10">

            </div>
        </div>

        <div class="row">
            <div class="col-2">
              Ernte:
            </div>
            <div class="col-10" >

            </div>
        </div>

        <div class="row">
            <div class="col-2">
              Kulturdauer:
            </div>
            <div class="col-10">

            </div>
        </div>

    </div>

    <!-- Part 5 Allgemeine Informationen-->
    <div class="container py-3">
        <b>Allgemeine Informationen</b>
        <div class="row">
            <div class="col-2">
                Gießen Infos:
            </div>
            <div class="col-10">
                coming soon
            </div>
        </div>

        <div class="row">
            <div class="col-2">
              Düngen Info:
            </div>
            <div class="col-10">
                coming soon
            </div>
        </div>

        <div class="row">
            <div class="col-2">
              Lagerung:
            </div>
            <div class="col-10" >
                coming soon
            </div>
        </div>

        <div class="row">
            <div class="col-2">
              Generelle Information:
            </div>
            <div class="col-10">
                coming soon
            </div>
        </div>

        <div class="row">
            <div class="col-2">
              Tipp:
            </div>
            <div class="col-10">
                coming soon
            </div>
        </div>

        <div class="row">
            <div class="col-2">
              Pflanzenersteller:
            </div>
            <div class="col-10">
                coming soon
            </div>
        </div>



    </div>

    <!-- button back/delete/update -->
    <div class="container py-3">
    <hr>
        <a class="btn btn-secondary btn-sm" href="{% url 'seed:seed_list' %}">Zurück</a>
        <a class="btn btn-danger btn-sm" href="{% url 'seed:seed_delete' seed.pk %}">Löschen</a>
        <a class="btn btn-success btn-sm" href="{% url 'seed:seed_update' seed.pk %}">Update</a>
    </div>

{% endblock content %}
seed/templates/seed/seed_delete.html

Code: Alles auswählen

{% extends 'main/base.html' %}
{% load django_bootstrap5 %}

{% block content %}
    <h2>Pflanze löschen</h2>
    <form action="" method="post">
        {% csrf_token %}
        <p>Bist du sicher das du folgende Adresse löschen möchtest?</p>
        <p><strong>{{ seed.seeding_date }}</strong></p>
        <a class="btn btn-secondary btn-sm" href="{% url 'seed:seed_detail' seed.pk %}">Zurück</a>
        <button type="submit" class="btn btn-danger btn-sm">Löschen</button>
    </form>
{% endblock content %}
und das Djangor Projekt settings.py

Code: Alles auswählen

"""
Django settings for web_saat_kalender project.

Generated by 'django-admin startproject' using Django 4.0.2.

For more information on this file, see
https://docs.djangoproject.com/en/4.0/topics/settings/

For the full list of settings and their values, see
https://docs.djangoproject.com/en/4.0/ref/settings/
"""

from pathlib import Path

# Build paths inside the project like this: BASE_DIR / 'subdir'.
BASE_DIR = Path(__file__).resolve().parent.parent


# Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/4.0/howto/deployment/checklist/

# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = 'django-insecure-^1u^m*5!!%70(%-s_c-%g7m#43dgtck-9hm(4lf-s&wb57p_&&'

# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True

ALLOWED_HOSTS = []


# Application definition

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'main',
    'seed',
    'plant',
    'django_bootstrap5',

]

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

ROOT_URLCONF = 'web_saat_kalender.urls'

LOGIN_URL = 'main:login'

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [BASE_DIR / 'templates'],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

WSGI_APPLICATION = 'web_saat_kalender.wsgi.application'


# Database
# https://docs.djangoproject.com/en/4.0/ref/settings/#databases

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'OPTIONS': {
            'read_default_file': 'config.ini',
        },
    }
}


# Password validation
# https://docs.djangoproject.com/en/4.0/ref/settings/#auth-password-validators

AUTH_PASSWORD_VALIDATORS = [
    {
        'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
    },
]


# Internationalization
# https://docs.djangoproject.com/en/4.0/topics/i18n/

LANGUAGE_CODE = 'de-de'

TIME_ZONE = 'Europe/Berlin'

USE_I18N = True

USE_TZ = True


# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/4.0/howto/static-files/

STATIC_URL = 'static/'

# Default primary key field type
# https://docs.djangoproject.com/en/4.0/ref/settings/#default-auto-field

DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'

und die urls.py in meinem Django Projekt

Code: Alles auswählen

from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include('main.urls')),
    path('plant/', include('plant.urls')),
    path('seed/', include('seed.urls'))


Bitte kann mir jemand helfen. Ich hänge seit Tagen an dem Problem und bin verzweifelt :-(
Recherche hat nichts gebracht.

viele Grüße
Gomez
Benutzeravatar
sparrow
User
Beiträge: 4187
Registriert: Freitag 17. April 2009, 10:28

gomez72 hat geschrieben: Sonntag 13. Februar 2022, 22:02Ich erzeuge mit einer seed_list.html eine Liste von Saat Daten. die ID kann man anklicken, und wird zur Detail Ansicht des Datensatzes geführt.
Wenn ich in der seed_list die ID eines Datensatzes anklicke, kommt der Fehler.
Das klingt seltsam.
Geht nun die seed_list.html oder geht sie nicht?
gomez72
User
Beiträge: 71
Registriert: Sonntag 28. März 2021, 09:57

die seed_list.html funktioniert. die Saat Daten werden als Tabelle angezeigt. Jedem Datensatz steht eine id voran. diese soll der user anklicken können um dann die DetailView des jeweiligen Datensatzes ansehen zu können. und genau hier entsteht der Fehler wenn ich von der seed:seed_list sozusagen zur seed:seed_detail rüber möchte.
Benutzeravatar
sparrow
User
Beiträge: 4187
Registriert: Freitag 17. April 2009, 10:28

Ah, ok.
Warum heißt "seed" im "seed_detail"-Template denn "seed"? Müsste das nicht object heißen?

Also grundsätzlich kannt du den Fehler ja eingrenzen:
Funktioniert der Aufruf der Detailseite grundsätzlich für ein Seed, wenn man ihn direkt, ohne Aufruf von der Liste verwendet (bzw. wird in der Liste ein korrekter Hyperlink erzeugt).
Wenn das direkte Aufrufen nicht funktioniert, muss der Fehler im Detail View liegen. Und hier ist wahrscheinlich, dass "seed" nicht enthält, was du denkst, dass es enthält. Wenn du dir reverse-URL-Einträge vorrübergehend aus dem Code entfernst, kannst du dir ja im Templte rendern, was "seed" ist. Und ich befüchte, es ist schlicht nicht da, weil in den generischen Views die Objekte immer "object" heißen. Weil es eben generische Views sind. Ansonsten müsstest du den Context überschreiben.
Zuletzt geändert von sparrow am Sonntag 13. Februar 2022, 23:27, insgesamt 1-mal geändert.
gomez72
User
Beiträge: 71
Registriert: Sonntag 28. März 2021, 09:57

sparrow hat geschrieben: Sonntag 13. Februar 2022, 23:17 Ah, ok.
Warum heißt "seed" im "seed_detail"-Template denn "seed"? Müsste das nicht object heißen?
ok, habe das gerade im code verändert. jetzt scheint es zu funktionieren. was mich nur total irritiert ist, dass ich in der anderen plant app im Projekt die gleichen templates nutze und dort es in der plant_detail.html genauso gelöst wurde, schau mal, wie kann man das erklären ??

plant/templates/plant/plant_detail.html

Code: Alles auswählen

{% extends 'main/base.html' %}

{% block content %}

<!-- Part 1 Title-->
<div class="container py-4">
    <h2>Detail: <br> {{plant.species_variety}}</h2>

</div>

<!-- Part 1 Bezeichnung-->
<div class="container py-2">
<hr><br>
<b>Bezeichnungen</b>
    <div class="row" >
        <div class="col-2" >
          ID:
        </div>
        <div class="col-10">
          {{plant.id}}
        </div>
    </div>

    <div class="row">
        <div class="col-2">
          Art:
        </div>
        <div class="col-10">
          {{plant.species}}
        </div>
    </div>

    <div class="row">
        <div class="col-2">
            Sorte:
        </div>
        <div class="col-10">
            {{plant.species_variety}}
        </div>
    </div>

    <div class="row">
        <div class="col-2">
            Gattung:
        </div>
        <div class="col-10">
            {{plant.genus}}
        </div>
    </div>

    <div class="row">
        <div class="col-2">
          Familie:
        </div>
        <div class="col-10">
          {{plant.family}}
        </div>
    </div>
</div>

<!-- Part 2 Wissenschaftliche Bezeichnung -->
<div class="container py-3">
    <b>Wissenschaftliche Bezeichnungen</b>
    <div class="row">
        <div class="col-2">
          Art:
        </div>
        <div class="col-10">
          {{plant.species_scientific}}
        </div>
    </div>

    <div class="row">
        <div class="col-2">
            Sorte:
        </div>
        <div class="col-10">
            {{plant.species_variety_scientific}}
        </div>
    </div>

    <div class="row">
        <div class="col-2">
            Gattung:
        </div>
        <div class="col-10">
            {{plant.genus_scientific}}
        </div>
    </div>

    <div class="row">
        <div class="col-2">
          Familie:
        </div>
        <div class="col-10">
          {{plant.family_scientific}}
        </div>
    </div>
</div>

<!-- Part 3 Saat Infos-->
<div class="container py-3">
    <b>Saat Infos</b>
    <div class="row">
        <div class="col-2">
          Keimtemperaturen:
        </div>
        <div class="col-10">
          {{plant.germination_temperature_begin}}-{{plant.germination_temperature_end}} °C
        </div>
    </div>

    <div class="row">
        <div class="col-2">
            Keimdauer:
        </div>
        <div class="col-10">
            {{plant.germination_period_begin}}-{{plant.germination_period_end}} Tage
        </div>
    </div>

    <div class="row">
        <div class="col-2">
            PH Wert:
        </div>
        <div class="col-10">
            {{plant.ph_value_from}}-{{plant.ph_value_to}}
        </div>
    </div>

    <div class="row">
        <div class="col-2">
          Saattiefe:
        </div>
        <div class="col-10">
          {{plant.seed_depth_from}}-{{plant.seed_depth_to}} cm
        </div>
    </div>

    <div class="row">
        <div class="col-2">
          Pflanzenabstand:
        </div>
        <div class="col-10">
            {{plant.plant_spacing}} cm
        </div>
    </div>

    <div class="row">
        <div class="col-2">
          Reihenabstand:
        </div>
        <div class="col-10">
            {{plant.row_spacing}} cm
        </div>
    </div>

    <div class="row">
        <div class="col-2">
          Wuchshöhe:
        </div>
        <div class="col-10">
            {{plant.growing_height}} cm
        </div>
    </div>
</div>

<!-- Part 4 Pflanzen Bedarf-->
<div class="container py-3">
    <b>Pflanzen Bedarf</b>
    <div class="row">
        <div class="col-2">
          Lichtbedarf:
        </div>
        <div class="col-10">
            {{plant.light_requirement}}
        </div>
    </div>

    <div class="row">
        <div class="col-2">
          Wasserbedarf:
        </div>
        <div class="col-10">
            {{plant.water_demand}}
        </div>
    </div>

    <div class="row">
        <div class="col-2">
          Nährstoffbedarf:
        </div>
        <div class="col-10">
            {{plant.nutrient_requirement}}
        </div>
    </div>

    <div class="row">
        <div class="col-2">
          1. Düngen nach:
        </div>
        <div class="col-10">
            {{plant.fertilize_first_after_seeding}} Tagen
        </div>
    </div>

    <div class="row">
        <div class="col-2">
          Düngen Intervall:
        </div>
        <div class="col-10">
            {{plant.fertilize_interval}} Tage
        </div>
    </div>
</div>

<!-- Part 5 Saat Zeiten-->
<div class="container py-3">
    <b>Saat Zeiten</b>
    <div class="row">
        <div class="col-2">
          Aussaat:
        </div>
        <div class="col-10">
            {{plant.seeding_planting_begin_day}}.{{plant.seeding_planting_begin_month}} -
            {{plant.seeding_planting_end_day}}.{{plant.seeding_planting_end_month}}
        </div>
    </div>

    <div class="row">
        <div class="col-2">
          Auspflanzen:
        </div>
        <div class="col-10">
            {{plant.planting_out_begin_day}}.{{plant.planting_out_begin_month}} -
            {{plant.planting_out_end_day}}.{{plant.planting_out_end_month}}
        </div>
    </div>

    <div class="row">
        <div class="col-2">
          Ernte:
        </div>
        <div class="col-10" >
            {{plant.harvest_begin_day}}.{{plant.harvest_begin_month}} -
            {{plant.harvest_end_day}}.{{plant.harvest_end_month}}
        </div>
    </div>

    <div class="row">
        <div class="col-2">
          Kulturdauer:
        </div>
        <div class="col-10">
            {{plant.culture_duration}} Tage
        </div>
    </div>

</div>

<!-- Part 5 Allgemeine Informationen-->
<div class="container py-3">
    <b>Allgemeine Informationen</b>
    <div class="row">
        <div class="col-2">
            Gießen Infos:
        </div>
        <div class="col-10">
            coming soon
        </div>
    </div>

    <div class="row">
        <div class="col-2">
          Düngen Info:
        </div>
        <div class="col-10">
            coming soon
        </div>
    </div>

    <div class="row">
        <div class="col-2">
          Lagerung:
        </div>
        <div class="col-10" >
            coming soon
        </div>
    </div>

    <div class="row">
        <div class="col-2">
          Generelle Information:
        </div>
        <div class="col-10">
            coming soon
        </div>
    </div>

    <div class="row">
        <div class="col-2">
          Tipp:
        </div>
        <div class="col-10">
            coming soon
        </div>
    </div>

    <div class="row">
        <div class="col-2">
          Pflanzenersteller:
        </div>
        <div class="col-10">
            coming soon
        </div>
    </div>



</div>

<!-- button back/delete/update -->
<div class="container py-3">
<hr>
    <a class="btn btn-secondary btn-sm" href="{% url 'plant:plant_list_name' %}">Zurück</a>
    <a class="btn btn-danger btn-sm" href="{% url 'plant:plant_delete' plant.pk %}">Löschen</a>
    <a class="btn btn-success btn-sm" href="{% url 'plant:plant_update' plant.pk %}">Update</a>
</div>

{% endblock content %}
Benutzeravatar
sparrow
User
Beiträge: 4187
Registriert: Freitag 17. April 2009, 10:28

Wie sieht denn die views.py dazu aus?
gomez72
User
Beiträge: 71
Registriert: Sonntag 28. März 2021, 09:57

sparrow hat geschrieben: Sonntag 13. Februar 2022, 23:27 Wie sieht denn die views.py dazu aus?
soweit ich das überblicken kann nicht anders..

plant/views.py

Code: Alles auswählen

from django.shortcuts import render

from plant.models import Plant
from django.urls import reverse_lazy
from django.views.generic import ListView, CreateView, DetailView, UpdateView, DeleteView


class PlantListBySpecies(ListView):
    model = Plant
    template_name = 'plant/plant_list.html'

    def get_queryset(self):
        order_by_plant = self.model.objects.order_by('species', 'species_variety')
        return order_by_plant


class PlantListByDate(ListView):
    model = Plant
    template_name = 'plant/plant_list.html'

    def get_queryset(self):
        order_by_plant = self.model.objects.order_by('seeding_planting_begin_month', 'seeding_planting_end_month')
        return order_by_plant


class PlantCreate(CreateView):
    model = Plant
    template_name = 'plant/plant_create.html'
    fields = '__all__'
    success_url = reverse_lazy('plant:plant_list_name')


class PlantDetail(DetailView):
    model = Plant
    template_name = 'plant/plant_detail.html'


class PlantUpdate(UpdateView):
    model = Plant
    template_name = 'plant/plant_update.html'
    fields = '__all__'
    #success_url = reverse_lazy('plant:plant_list')


class PlantDelete(DeleteView):
    model = Plant
    template_name = 'plant/plant_delete.html'
    success_url = reverse_lazy('plant:plant_list_name')
Benutzeravatar
sparrow
User
Beiträge: 4187
Registriert: Freitag 17. April 2009, 10:28

Doch, es gibt einen ziemlich gundlegenden Unterschied.
Die Views verwenden SingleObjectMixedIn. Das heißt, das Objekt, das verwendet wird, ist in self.object verfügbar - und in dem was das Model mit get_context_object_name(obj) zurück gibt. Deshalb ist man mit self.object immer auf der sicheren Seite.
.get_context_object_name(obj) gibt normalerweise die lowercase-Version des Namens des Models zurück. Bei "Plant" wird daraus "plant". Bei "SeedingProcess" wird daraus nicht auf magische Weise "seed".

Ich würde immer object nehmen.
gomez72
User
Beiträge: 71
Registriert: Sonntag 28. März 2021, 09:57

ok wie das ganz jetzt hinter diesem SingelObjectMixedIn funktioniert, habe ich jetzt noch nicht verstanden, aber ich kürze für mich mal ab, dass Django eine Art "Konvertierung" des Klassen model Namens anbietet, für welchen Zweck muss ich jetzt nicht wissen. Das hat natürlich bei Plant zu plant dann funktioniert aber nicht bei SeedingProcess zu seed.
Ich danke dir sehr !!! Meine Kopfschmerzen hören auf. !!!!!!!!
Antworten