Как сделать DetailView в Django 1.3? - PullRequest
5 голосов
/ 15 мая 2011

В настоящее время я учусь использовать представления на основе классов в django 1.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?

1 Ответ

10 голосов
/ 16 мая 2011

Единственная проблема, которую я вижу в вашем коде, заключается в том, что параметр slug вашего URL-адреса называется 'space_name' вместо 'slug'.Атрибут slug_field представления относится к полю модели, которое будет использоваться для поиска слагов, а не к имени захвата URL.В URL вы должны назвать параметр 'slug' (или 'pk', когда он используется вместо этого).

Кроме того, если вы определяете метод get_object, вам не нужны атрибутыqueryset, model или slug_field, если вы не используете их в своем get_object или где-либо еще.

В приведенном выше случае вы можете использовать get_object, как вы написали, или определитьтолько следующие:

model = Space
slug_field = 'space_name'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...