Seite 1 von 1

Django, generic views, permalinks

Verfasst: Dienstag 13. Oktober 2009, 16:04
von davidmm
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!

Verfasst: Dienstag 13. Oktober 2009, 18:48
von apollo13
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.

Verfasst: Dienstag 13. Oktober 2009, 19:15
von str1442
Vermutlich ist "article_detail" nicht der wirkliche Importpfad der entsprechenden View Funktion.

Verfasst: Dienstag 13. Oktober 2009, 20:15
von davidmm
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.

Verfasst: Dienstag 13. Oktober 2009, 21:00
von davidmm
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

Verfasst: Mittwoch 14. Oktober 2009, 07:21
von jens
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...

Verfasst: Mittwoch 14. Oktober 2009, 07:43
von davidmm
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.