Создать представление, обратное к DetailView

Я пытаюсь перейти от CreateView к DetailView после того, как загрузил свое изображение.

Я получаю то же сообщение

NoReverseMatch at /photo/image/add Обратное для 'image-view' с аргументами '()' и аргументами ключевого слова '{'pk': 50}' не найдено. Пробовали 0 шаблонов: []

Это моя модель для изображения

from django.db import models
from django.contrib.auth.models import User
from django.contrib import admin
from django.conf import settings
from string import join
import os

class Image(models.Model):
    title = models.CharField(max_length=60, blank=True, null=True)
    image = models.FileField(upload_to="images/")
    tags = models.ManyToManyField(Tag, blank=True)
    albums = models.ManyToManyField(Album, blank=True)
    created = models.DateTimeField(auto_now_add=True)
    rating = models.IntegerField(default=50)
    width = models.IntegerField(blank=True, null=True)
    height = models.IntegerField(blank=True, null=True)
    user = models.ForeignKey(User, null=True, blank=True)


    def __unicode__(self):
        return self.image.name

    def size(self):
            return "%s x %s" % (self.width, self.height)


    def tags_(self):
        lst = [x[1] for x in self.tags.values_list()]
        return str(join(lst, ', '))

    def albums_(self):
        lst = [x[1] for x in self.albums.values_list()]
        return str(join(lst, ', '))

    def thumbnail(self):
        return """<a href="/media/%s"><img border="0" alt="" src="/media/%s" height="40" /></a>""" % (
                                                                        (self.image.name, self.image.name))
        thumbnail.allow_tags = True

    def get_absolute_url(self,*args,**kwargs):
        return reverse('image-view',kwargs={'pk': self.pk})

Мои urls.py

from django.conf.urls import patterns, url
from django.conf import settings
from django.conf.urls.static import static
from photo import views


urlpatterns = patterns('',
    url(r'^image/(?P<pk>\d+)/$', views.ImageView.as_view(),name='image-view',),
    url(r'^$', views.ListImage.as_view(),name ='Photo-List',),
    url(r'^image/add/$', views.ImageCreate.as_view(), name = 'create-image',),
    url(r'update/(?P<pk>\d+)/$', views.ImageUpdate.as_view(),name='image-update',),

) 

if settings.DEBUG:
    urlpatterns += static(settings.STATIC_URL,
                          document_root = settings.STATIC_ROOT)
    urlpatterns += static(settings.MEDIA_URL,
                          document_root = settings.MEDIA_ROOT)

мои взгляды

from django.views.generic import ListView, DetailView, UpdateView, CreateView, UpdateView, DeleteView
from django.core.urlresolvers import reverse_lazy, reverse
from photo.models import Tag, Image, Album
from django.conf import settings

class ImageView(DetailView):
    model = Image
    allow_empty = True
    template_name = 'image.html'

class ListImage(ListView):
    #context_object_name = 'object_list'
    template_name = 'image_list.html'
    model = Image
    #def get_queryset(self):
    #    return Image.objects.all()

class ImageCreate(CreateView):
    model = Image
    template_name='image_create.html'
    fields = ['title','image']

Подробнее о моей ошибке

Traceback Switch to copy-and-paste view

/Library/Python/2.7/site-packages/django/core/handlers/base.py in get_response
                    response = wrapped_callback(request, *callback_args, **callback_kwargs) ...
▶ Local vars
/Library/Python/2.7/site-packages/django/views/generic/base.py in view
            return self.dispatch(request, *args, **kwargs) ...
▶ Local vars
/Library/Python/2.7/site-packages/django/views/generic/base.py in dispatch
        return handler(request, *args, **kwargs) ...
▶ Local vars
/Library/Python/2.7/site-packages/django/views/generic/edit.py in post
        return super(BaseCreateView, self).post(request, *args, **kwargs) ...
▶ Local vars
/Library/Python/2.7/site-packages/django/views/generic/edit.py in post
            return self.form_valid(form) ...
▶ Local vars
/Library/Python/2.7/site-packages/django/views/generic/edit.py in form_valid
        return super(ModelFormMixin, self).form_valid(form) ...
▶ Local vars
/Library/Python/2.7/site-packages/django/views/generic/edit.py in form_valid
        return HttpResponseRedirect(self.get_success_url()) ...
▶ Local vars
/Users/henriaugris/Documents/Django/mysite/photo/views.py in get_success_url
        return reverse('image-view', kwargs={'pk' : self.object.pk}) ...
▶ Local vars
/Library/Python/2.7/site-packages/django/core/urlresolvers.py in reverse
    return iri_to_uri(resolver._reverse_with_prefix(view, prefix, *args, **kwargs)) ...
▶ Local vars
/Library/Python/2.7/site-packages/django/core/urlresolvers.py in _reverse_with_prefix
                             (lookup_view_s, args, kwargs, len(patterns), patterns)) ...
▶ Local vars
Request information

GET
No GET data

person Han Ry    schedule 12.11.2014    source источник
comment
Вы пытались установить переменную успеха в представлении?   -  person frlan    schedule 12.11.2014
comment
где from django.core.urlresolvers import reverse в ваших моделях?   -  person madzohan    schedule 12.11.2014
comment
Мадзохан: это на мой взгляд   -  person Han Ry    schedule 12.11.2014
comment
@frlan как настроить успех?   -  person Han Ry    schedule 12.11.2014
comment
@madzohan любая помощь, пожалуйста?   -  person Han Ry    schedule 18.11.2014
comment
Я уже ответил - вы используете reverse в своих моделях get_absolute_url но не импортировали его туда   -  person madzohan    schedule 18.11.2014


Ответы (1)


Вместо установки get_absolute_url в файле models.py следующим образом:

def get_absolute_url(self,*args,**kwargs):
        return reverse('image-view',kwargs={'pk': self.pk})

Вы можете установить его в файле views.py в разделе:

class ImageCreate(CreateView):
    model = Image
    template_name='image_create.html'
    fields = ['title','image']
    def get_success_url(self):
        return reverse('image-view', kwargs={'pk' : self.object.pk})

    def get_form_kwargs(self, *args, **kwargs):
        kwargs = super(ImageCreate, self).get_form_kwargs(
            *args, **kwargs)
        return kwargs

После внесения этого изменения вы должны удалить get_absolute_url из вашего файла models.py. С этим изменением вы должны перейти к подробному представлению изображения, которое вы загрузили после успешного создания нового изображения.

person sv_rancher    schedule 18.11.2014
comment
github.com/django/django/ blob/master/django/views/generic/ то же самое - person madzohan; 19.11.2014
comment
и что вы имели в виду под переопределением get_form_kwargs, но не использовали его? - person madzohan; 19.11.2014
comment
Сегодня вечером я обновлю свой проект на github, спасибо за ваше терпение. Я только что прокомментировал get_form_kwars для отладки первой части. - person Han Ry; 19.11.2014
comment
@madzohan, ребята, вы хоть понимаете, что не так? Я попытался использовать success_url для своего DeletView, но он работает только тогда, когда я жестко запрограммирую URL-адрес, поэтому я думаю, что Django не распознает имена, которые я дал своим различным представлениям в urls.py. - person Han Ry; 20.11.2014