Django: Detail-View schreiben, brauche Hilfe:

Django, Flask, Bottle, WSGI, CGI…
Antworten
Rumpel
User
Beiträge: 9
Registriert: Dienstag 5. August 2014, 08:32

Hallo Leute,

ich bin bei Django angelangt und möchte damit gerne ein kleines Projekt realisieren: Ich möchte auf einer Seite einen Überblick darüber geben, was in verschiedenen Theatern gespielt wird.
Meine Models sind Theater und Stück:

Code: Alles auswählen

# -*- coding: utf8 -*-

from django.db import models
from django.utils.encoding import python_2_unicode_compatible

# Create your models here.

@python_2_unicode_compatible
class Stueck(models.Model):
	titel = models.CharField(max_length=50, unique = True)
	url = models.URLField()
	date = models.DateField()

	def __str__(self):
		return self.titel

	class Meta:
		verbose_name = 'Stück'
		verbose_name_plural = 'Stücke'

@python_2_unicode_compatible
class Theater(models.Model):
	name = models.CharField(max_length=50, unique = True)
	kuerzel = models.CharField(max_length=50, default= '001', unique = True)
	url = models.URLField()
	telefon = models.IntegerField()
	stuecke = models.ManyToManyField(Stueck, blank = True)

	class Meta:
		verbose_name = 'Theater'
		verbose_name_plural = 'Theater'

	def __str__(self):
		return self.name
Dazu habe ich zunächst eine Index-View, welche mir alle Theater und deren Stücke anzeigt. Das klappt auch wunderbar.
Nun möchte ich einen zweiten View hinzufügen, der mir im Detail mehr Informationen zu einem speziellen Theater und dessen
Spielplan gibt. Das bekomme ich leider aber nicht hin. Hier sind meine Views:

Code: Alles auswählen

from django.shortcuts import render
from .models import Theater
# Create your views here.

def index(request):
	theater = Theater.objects.all()
	context = {'theater': theater}
	return render(request, 'theater/index.html', context)

def theater(request, kuerzel):
	kuerzel = Theater.objects.get(kuerzel)
	context = {'kuerzel', kuerzel}
	return render(request, 'theater/details.html', context)
Ich trete irgendwie auf der Stelle und weiß nicht weiter. Wenn ich das so, wie es ist, laufen lasse,
bekomme ich folgenden Fehler:

http://127.0.0.1:8000/theater/berlinerEnsemble/
ValueError - too many Values to unpack

Könnt ihr mir weiterhelfen ?

Gruß Jan
BlackJack

@Rumpel: Da wird es doch noch einen Traceback zu geben, oder? Sonst kann man ja nicht wirklich heraus finden wo man suchen soll. Ich rate sonst mal das es ein Fehler im Template ist.
Rumpel
User
Beiträge: 9
Registriert: Dienstag 5. August 2014, 08:32

Hi BlackJack,

hier ist der Traceback:

Code: Alles auswählen

Environment:


Request Method: GET
Request URL: http://127.0.0.1:8000/theater/berlinerEnsemble/

Django Version: 1.6.5
Python Version: 2.7.6
Installed Applications:
('django.contrib.admin',
 'django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.messages',
 'django.contrib.staticfiles',
 'theater',
 'south')
Installed Middleware:
('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')


Traceback:
File "/usr/local/lib/python2.7/dist-packages/django/core/handlers/base.py" in get_response
  112.                     response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/home/jan-philipp/python/project1/theater/views.py" in theater
  11. 	kuerzel = Theater.objects.get(kuerzel)
File "/usr/local/lib/python2.7/dist-packages/django/db/models/manager.py" in get
  151.         return self.get_queryset().get(*args, **kwargs)
File "/usr/local/lib/python2.7/dist-packages/django/db/models/query.py" in get
  301.         clone = self.filter(*args, **kwargs)
File "/usr/local/lib/python2.7/dist-packages/django/db/models/query.py" in filter
  593.         return self._filter_or_exclude(False, *args, **kwargs)
File "/usr/local/lib/python2.7/dist-packages/django/db/models/query.py" in _filter_or_exclude
  611.             clone.query.add_q(Q(*args, **kwargs))
File "/usr/local/lib/python2.7/dist-packages/django/db/models/sql/query.py" in add_q
  1204.         clause = self._add_q(where_part, used_aliases)
File "/usr/local/lib/python2.7/dist-packages/django/db/models/sql/query.py" in _add_q
  1240.                     current_negated=current_negated)
File "/usr/local/lib/python2.7/dist-packages/django/db/models/sql/query.py" in build_filter
  1038.         arg, value = filter_expr

Exception Type: ValueError at /theater/berlinerEnsemble/
Exception Value: too many values to unpack
Gruß Jan
BlackJack

Wo kommt denn `kuerzel` her? Wie sieht die besagte Datei denn aus?

Code: Alles auswählen

File "/home/jan-philipp/python/project1/theater/views.py" in theater
  11.   kuerzel = Theater.objects.get(kuerzel)
Rumpel
User
Beiträge: 9
Registriert: Dienstag 5. August 2014, 08:32

kuerzel ist ein Namenskürzel und soll den URL-Zusatz bilden. Also wenn das Theater Berliner Ensemble heißt, ist das Kürzel berlinerEnsemble.
Ich möchte, dass es dann die URL theater/berlinerEnsemble gibt.

kuerzel ist im Model Theater enthalten.

Gruß Jan
Rumpel
User
Beiträge: 9
Registriert: Dienstag 5. August 2014, 08:32

Also in anderen Worten:

Wie definiere ich einen View, der mir die Details eines Theaters zeigt? Hat keiner eine Idee?
BlackJack

@Rumpel: Ja aber was enthält `kuerzel`, also das rechte. Ist ein wenig ungünstig den Namen für zwei verschiedene Dinge zu verwenden. Schon 'ne Weile her dass ich Django verwendet habe, und ich hätte jetzt vermutet wenn man kein Schlüsselwort beim Aufruf verwendet wird der Primärschlüssel verwendet!?
Rumpel
User
Beiträge: 9
Registriert: Dienstag 5. August 2014, 08:32

Das nehme ich auch an. Mir ist im Prinzip egel womit ich es aufrufe. Wenn der PK besser dazu geeignet ist, nehme ich auch den. Ich muss nur wissen, wie ich das machen muss. Kürzel ist ein CharField, das ich im Admim bereich mit einem Namen versehe

Gruß Jan
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

@Rumpel: Was Du nimmst, ist im Prinzip egal, Du mußt nur objects.get so aufrufen, wie es gedacht ist, also mit "field=value".
Rumpel
User
Beiträge: 9
Registriert: Dienstag 5. August 2014, 08:32

@sirius3

Aber genau das mache ich doch in meinem Code, oder?
Rumpel
User
Beiträge: 9
Registriert: Dienstag 5. August 2014, 08:32

HA, ich habe es! Sirius, du hattest Recht, ich musste für den Context

theater = Theater.objects.get(pk=pk)

angeben. Vielen Dank an euch beide, für die Hilfe. Habt einen schönen Abend

Gruß Jan
Antworten