Django, generic views, permalinks

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
davidmm
User
Beiträge: 9
Registriert: Dienstag 13. Oktober 2009, 15:52

Hallo Forum,

ich versuche im Moment eine kleine Blogapplikation für mich zu schreiben. Ich benutze hierfür Django 1.1.

Leider habe ich im Moment Probleme die get_absolute_url Funktion meines Article Modells zum funktionieren zu bringen.

Folgendes: Ich möchte, dass die zurückgegebene URL auf den generic view 'django.views.generic.date_based.object_detail' zeigt.

In meiner 'meineapp/blog/urls.py' habe ich die Zeile:

Code: Alles auswählen

urlpatterns = patterns('',
	# anderes zeug
	(r'^(?P<year>\d{4})/(?P<month>[a-z]{3})/(?P<day>\w{1,2})/(?P<slug>[-\w]+)/$',  'django.views.generic.date_based.object_detail', date_based_dict),
)
In meiner 'meineapp/blog/models.py' habe ich die Zeilen:

Code: Alles auswählen

	
class Article(models.Model)
	# anderes zeug
	@models.permalink
	def get_absolute_url(self):
		return ('article_detail', (), {'year':self.published_date.year, 'month':self.published_date.month, 'day':self.published_date.day, 'slug':self.slug})
wenn ich jetzt diese Funktion eines Objectes aufrufe, dann bekomme ich einen Fehler "Reverse for 'article_detail' with arguments ... not found".

Wie wäre hier die richtige Vorgehensweise?

Vielen Dank!
apollo13
User
Beiträge: 827
Registriert: Samstag 5. Februar 2005, 17:53

Du willst die ganze Fehlermeldung zeigen… Abgesehen davon zeigt dein beispiel die article_detail -url Definition nicht, poste also entweder die ganzen files oder lass es bleiben.
Benutzeravatar
str1442
User
Beiträge: 520
Registriert: Samstag 31. Mai 2008, 21:13

Vermutlich ist "article_detail" nicht der wirkliche Importpfad der entsprechenden View Funktion.
davidmm
User
Beiträge: 9
Registriert: Dienstag 13. Oktober 2009, 15:52

Hallo,
die URL-Definition soll die für die für 'article_detail' sein. Zumindest habe ich vermutet dass man den view so ansprechen kann. Es wird ja auch das article_detail.html template geladen.

Blöderweise kann man aus der Django shell unter Windows nichts kopieren - keine Ahnung wer sich das ausgedacht hat. Ich werde später einen Screenshot nachreichen.

Wenn ich in einem template {{article.get_absolute_url}} verwende, dann wird einfach an dieser Stelle nichts ausgegeben.
davidmm
User
Beiträge: 9
Registriert: Dienstag 13. Oktober 2009, 15:52

Also hier komplett.

urls.py

Code: Alles auswählen

from django.conf.urls.defaults import patterns, url
from django.contrib.syndication.views import feed

from pweb.blog import views, models
from pweb.blog.models import Article

date_based_dict = {
	'queryset': Article.objects.all(),
	'date_field': 'published_date'
}

list_detail_dict = {
	'queryset': Article.objects.all(),
}

urlpatterns = patterns('',
	(r'^$', 'django.views.generic.list_detail.object_list', list_detail_dict),
	(r'^(?P<year>\d{4})/$', 'django.views.generic.date_based.archive_year', date_based_dict),
	(r'^(?P<year>\d{4})/(?P<month>[a-z]{3})/(?P<day>\w{1,2})/(?P<slug>[-\w]+)/$',  'django.views.generic.date_based.object_detail', date_based_dict),
)
models.py

Code: Alles auswählen

import datetime
from django.db import models
from django.contrib.auth.models import User

# Create your models here.

class Article(models.Model):
	DRAFT_STATUS = 1;
	PUBLISHED_STATUS = 2;
	STATUS_CHOICES = ((DRAFT_STATUS, 'Draft'), (PUBLISHED_STATUS, 'Published'))
	
	title = models.CharField(max_length=128)
	slug = models.SlugField(unique_for_year='published_date')
	content = models.TextField(blank=True)
	author = models.ForeignKey(User)
	created_date = models.DateTimeField(auto_now_add=True)
	published_date = models.DateTimeField(default=datetime.datetime.now)
	updated_date = models.DateTimeField(auto_now=True)
	status = models.SmallIntegerField(choices=STATUS_CHOICES, default=DRAFT_STATUS)
	enable_comments = models.BooleanField(default=False)
	
	class Meta:
		get_latest_by = 'published_date'
		ordering = ('-published_date',)
	
	def __unicode__(self):
		return self.title
		
	@models.permalink
	def get_absolute_url(self):
		return ('article_detail', (), {'year':self.published_date.year, 'month':self.published_date.month, 'day':self.published_date.day, 'slug':self.slug})
Und hier die Fehlermeldung:
Bild
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Schau dir mal das an: http://docs.djangoproject.com/en/dev/to ... /urls/#id2

btw. natürlich kann man Text aus der Eingabeaufforderung kopieren: "Makieren" aus Kontext Menü auswählen (Rechte Maustaste). Dann Bereich Auswählen und wieder rechte Maustaste. Danach ist der Bereich in der Zwischenablage...

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
davidmm
User
Beiträge: 9
Registriert: Dienstag 13. Oktober 2009, 15:52

Danke, das wars!

Das mit dem parameter 'name' hatte ich schon ausprobiert, allerdings hatte ich noch einen weiteren Stolperstein eingebaut. Das Permalink hat den Monat in Ziffern angegeben, wogegen die URL aus Buchstaben bestehen sollte.

Also alles gelöst, vielen Dank!

Edit: ich habe die Python shell genutzt, also '.\manage.py shell' zum starten verwendet. Mit der Powershell direkt 'python.exe manage.py shell' kann man dann auch copy-paste benutzen.
Antworten