1

Django1.5を使用しています

私はhtmlファイルにこのコードのブロックを持っています

{% for p in latest_posts %}
      <li><a href="{% url 'blog:detail' p.id %}">{{p.title}}</a></li>
{% endfor %}

p.idをp.titleに変更した場合

{% for p in latest_posts %}
      <li><a href="{% url 'blog:detail' p.title %}">{{p.title}}</a></li>
{% endfor %}

次に、次のエラーが発生します

Reverse for 'detail' with arguments '(u'Second post',)' and keyword arguments '{}' not found.

URLを/idではなく/titleにします。

これは私のurls.pyファイルです

urlpatterns = patterns ('',

    url(r'^(?P<title>\w+)/$',
            PostDetailView.as_view(),
            name = 'detail'
        ),
)

get_absolute_urlを使用する必要がありますか?

アップデート

スラッグフィールドを追加しましたが、それでも機能しません

{% url 'blog:detail' p.slug %}

私が得るエラーは

Reverse for 'detail' with arguments '(u'third-post',)' and keyword arguments '{}' not found.

ポストモデル

class Post(models.Model):
    title = models.CharField(max_length = 225)
    body = models.TextField()
    slug = models.SlugField()
    pub_date = models.DateTimeField()
    modified = models.DateTimeField(auto_now=True)
    created = models.DateTimeField(auto_now_add=True)

    def __unicode__(self):
        return self.title

管理者が更新されます

class PostAdmin(admin.ModelAdmin):
    prepopulated_fields = {"slug" : ("title",)}


admin.site.register(Post, PostAdmin)

これが機能する場合

<a href="{% url 'blog:detail' p.id %}">{{p.title}}</a>

なぜこれが機能しないのですか

<li><a href="{% url 'blog:detail' p.slug %}">{{p.title}}</a></li>

アップデート

PostDetailView

class PostDetailView(DetailView):

    template_name = 'blogapp/post/detail.html'

    def get_object(self):
        return get_object_or_404(Post, slug__iexact = self.kwargs['slug'])
4

2 に答える 2

2

調べたいことの 1 つは、URL で使用できるデータを取得できるようにするスラッグフィールドです。スラッグには、文字、数字、アンダースコア、またはハイフンのみを含めることができます。saveそこから、モデルのメソッドをオーバーライドして設定し、スラッグフィールドが一意であることを確認したいと思うでしょう。その後、そのフィールドを URL の識別子として使用できます。{% url 'blog:detail' slug=p.slug %}次に、フィールドに名前を付けたと仮定するようなことができますslug。また、別の回答で指摘されているように、これを使用する場合は、代わりにスラッグを探すように URL を修正する必要があります。

urlpatterns = patterns ('',

    url(r'^(?P<slug>[\w-]+)/$',
        PostDetailView.as_view(),
        name = 'detail'
    ),

)

于 2013-03-04T01:19:00.863 に答える
0

一般的な詳細ビューを使用している場合は、id または slug 値が必要です。

ただし、URL conf では、名前付き変数を「タイトル」として指定しています。「スラッグ」に変更してみてください:

urlpatterns = patterns ('',

    url(r'^(?P<slug>\w+)/$',
            PostDetailView.as_view(),
            name = 'detail'
        ),
)
于 2013-03-05T01:13:31.470 に答える