5

私は現在、django1.3でクラスベースのビューを使用する方法を学んでいます。それらを使用するようにアプリケーションを更新しようとしていますが、それでもそれらがどのように機能するかをよく理解していません(そして、クラスベースのビューリファレンス全体を毎日2〜3回読んでいます)。

質問に対して、私はいくつかの追加のコンテキストデータを必要とするスペースインデックスページを持っています、urlパラメータは名前(pkではなく、変更することはできません、それは期待される動作です)であり、そのスペースを持たないユーザープロファイルで選択されたものは入力できません。

私の関数ベースのコード(正常に動作しています):

def view_space_index(request, space_name):

    place = get_object_or_404(Space, url=space_name)

    extra_context = {
        'entities': Entity.objects.filter(space=place.id),
        'documents': Document.objects.filter(space=place.id),
        'proposals': Proposal.objects.filter(space=place.id).order_by('-pub_date'),
        'publication': Post.objects.filter(post_space=place.id).order_by('-post_pubdate'),
    }

    for i in request.user.profile.spaces.all():
        if i.url == space_name:
            return object_detail(request,
                                 queryset = Space.objects.all(),
                                 object_id = place.id,
                                 template_name = 'spaces/space_index.html',
                                 template_object_name = 'get_place',
                                 extra_context = extra_context,
                                )

    return render_to_response('not_allowed.html', {'get_place': place},
                              context_instance=RequestContext(request))

私のクラスベースのビュー(機能しておらず、続行する方法がわかりません):

class ViewSpaceIndex(DetailView):

    # Gets all the objects in a model
    queryset = Space.objects.all()

    # Get the url parameter intead of matching the PK
    slug_field = 'space_name'

    # Defines the context name in the template
    context_object_name = 'get_place'

    # Template to render
    template_name = 'spaces/space_index.html'

    def get_object(self):
        return get_object_or_404(Space, url=slug_field)

    # Get extra context data
    def get_context_data(self, **kwargs):
        context = super(ViewSpaceIndex, self).get_context_data(**kwargs)
        place = self.get_object()
        context['entities'] = Entity.objects.filter(space=place.id)
        context['documents'] = Document.objects.filter(space=place.id)
        context['proposals'] = Proposal.objects.filter(space=place.id).order_by('-pub_date')
        context['publication'] = Post.objects.filter(post_space=place.id).order_by('-post_pubdate')
        return context

urls.py

from e_cidadania.apps.spaces.views import GoToSpace, ViewSpaceIndex
urlpatterns = patterns('',
    (r'^(?P<space_name>\w+)/', ViewSpaceIndex.as_view()),
)

DetailViewが機能するために何が欠けていますか?

4

1 に答える 1

10

私があなたのコードで見る唯一の問題は、あなたのurlのslugパラメータが。'space_name'の代わりに名前が付けられているということです'slug'。ビューのslug_field属性は、URLキャプチャ名ではなく、スラッグルックアップに使用されるモデルフィールドを参照します。URLで、パラメーターに名前を付ける必要があります'slug'(または'pk'、代わりに使用する場合は、)。

また、メソッドを定義している場合は、自分または他の場所で使用しない限り、属性、またはget_objectは必要ありません。querysetmodelslug_fieldget_object

上記の場合、あなたがget_object書いたようにあなたを使うか、以下を定義することができます、ただ:

model = Space
slug_field = 'space_name'
于 2011-05-16T04:44:40.140 に答える