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']
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'
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 %}
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 %}
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