【问题标题】:Django Class Based View CreateView url resolution基于 Django 类的视图 CreateView url 解析
【发布时间】:2014-01-22 14:31:34
【问题描述】:

我对 CBV 还很陌生,我正在努力理解它。我从 django 文档页面复制了以下示例:

https://docs.djangoproject.com/en/dev/topics/class-based-views/generic-editing/

models.py

from django.core.urlresolvers import reverse
from django.db import models

class Author(models.Model):
    name = models.CharField(max_length=200)

    def get_absolute_url(self):
        return reverse('author-detail', kwargs={'pk': self.pk})

views.py

from django.views.generic.edit import CreateView, UpdateView, DeleteView
from django.core.urlresolvers import reverse_lazy
from myapp.models import Author

class AuthorCreate(CreateView):
    model = Author
    fields = ['name']

class AuthorUpdate(UpdateView):
    model = Author
    fields = ['name']

class AuthorDelete(DeleteView):
    model = Author
    success_url = reverse_lazy('author-list')

urls.py

from django.conf.urls import patterns, url
from myapp.views import AuthorCreate, AuthorUpdate, AuthorDelete

urlpatterns = patterns('',
    # ...
    url(r'author/add/$', AuthorCreate.as_view(), name='author_add'),
    url(r'author/(?P<pk>\d+)/$', AuthorUpdate.as_view(), name='author_update'),
    url(r'author/(?P<pk>\d+)/delete/$', AuthorDelete.as_view(), name='author_delete'),
)

在作者/添加/我确实得到了表单,但是当我输入字符串时,我得到以下错误:

Reverse for 'author-detail' with arguments '()' and keyword arguments '{'pk': 3}' not found.

似乎新条目已添加到数据库中,但无法解析下一个视图的 URL?

所以我很困惑,这个 get_absolute_url() 对象的方法应该做什么,它是如何工作的(我无法从 django 文档中掌握它)以及如何解决这个问题? 谢谢。

编辑1:添加模板:

author_form.html:

<form action="" method="post">{% csrf_token %}
    {{ form.as_p }}
    <input type="submit" value="Create" />
</form>

【问题讨论】:

  • 您的所有网址都没有名称 author-detail。提交表单后是否出现此错误?
  • 是的,这正是我运行的代码和提交后收到的错误消息。

标签: django django-models django-views django-urls django-class-based-views


【解决方案1】:

默认情况下,当创建新模型时,django 会将您重定向到由 get_absolute_url 方法返回的模型绝对 URL。在您的示例中,您需要添加一个名称为 author-detail 的 URL,该 URL 接受 pk 关键字参数。

urlpatterns = patterns('',
  # ...
  url(r'author/(?P<pk>\d+)/$', AuthorDetail.as_view(), name='author-detail'),
)

注意 url 的名称与 get_absolute_url 方法中的视图名称匹配。

在您的模板中使用它:

{% for author in authors %}
  <a href="{{author.get_absolute_url}}">{{author.name}}</a>
{% endfor %}

【讨论】:

  • 如果您要使用自定义视图,则应该有一个接受pk 参数的视图(即在views.py 文件中),如def MyCustomDetailView(request, pk):
猜你喜欢
  • 2015-07-26
  • 1970-01-01
  • 2012-12-28
  • 2017-11-07
  • 2012-01-25
  • 2021-07-12
  • 1970-01-01
  • 2015-02-03
  • 2015-04-30
相关资源
最近更新 更多