Передать слаг и контекст для отображения страницы?

Я показываю запись с помощью DetailView, а также имею форму комментариев на той же странице.

Форма комментария отлично работает для представлений, но не отображает ошибки проверки.

Я не могу понять, как передать оба slug (требуется для DetailView) И form ( который содержит ошибки проверки).

Я не пытаюсь отобразить слаг в своем html-шаблоне - мне нужен слаг для получения подробного представления записи.

URL:

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

Вид:

class EntryDetailView(DetailView):
    template_name = "entry_detail.html"

    def get_context_data(self, **kwargs):
        context = super(EntryDetailView, self).get_context_data(**kwargs)

        context['comments'] =  [(comment, comment.get_children_count()) for comment in EntryComment.get_tree()]

        entry_comment_form = EntryCommentForm()
        context['entry_comment_form'] = entry_comment_form

        return context

    def get_object(self, **kwargs):
        # If the user created the entry:
        try: return Entry.objects.get(Q(slug=self.kwargs['slug']), author=self.request.user.id)
        except: pass

        # If the user received the entry:
        try: return Entry.objects.get(Q(slug=self.kwargs['slug']), recipients=self.request.user)
        except: pass

        # Otherwise, bye-bye.
        raise Http404

    def post(self, request, *args, **kwargs):
        entry_comment_form = EntryCommentForm(request.POST)

        if entry_comment_form.is_valid():
            entry_comment_form.add_method(
                author=entry_comment_form.cleaned_data['author'],
                body=entry_comment_form.cleaned_data['body'],
                date_created=datetime.datetime.now()
            )

            success(request, 'Success')
            slug = self.kwargs['slug']

            # Proper? It works.
            return HttpResponseRedirect(reverse('entry_detail', subdomain='blog', kwargs={'slug':slug}))

        else:
            error(request, 'Error')
            slug = self.kwargs['slug']

            # Here's where I need to render the same Entry but include the form context so I can display the validation errors.
            return render(
                request,
                reverse('entry_detail', kwargs={'slug':slug}), 
                {'entry_comment_form':entry_comment_form}
            )

Похоже, это просто ошибка новичка из-за отсутствия у меня python/django foo.

Конечная цель — отобразить ту же страницу DetailView (есть ли способ сделать это без передачи слага в URL-адрес?) и включить форму в контекст, чтобы я мог отображать ошибки проверки формы комментариев.

Искал вокруг, не смог найти подходящих ответов.


person Community    schedule 11.12.2013    source источник


Ответы (2)


Что, если вы реорганизуете его, чтобы использовать один из настраиваемых тегов, которые поставляются с модулем комментариев?

https://docs.djangoproject.com/en/1.5/ref/contrib/comments/#quickly-rendering-the-comment-form

Можете ли вы просто использовать тег get_comment_form с object, чтобы избежать передачи формы?

person John Mee    schedule 11.12.2013

То, что вы пытаетесь, не имеет смысла. Вы передаете результат reverse, то есть URL-адрес, в качестве шаблона при вызове функции render. Зачем ты это делаешь?

Однако, чтобы действительно помочь вам, нам нужно знать, что вы на самом деле делаете. Где этот странный код? В функции представления, в методе представления на основе класса, в теге шаблона или где-то еще?

Редактировать после публикации полного кода

В этом коде представления есть несколько ошибок (пустое excepts, которое просто выполняет pass?), но я сосредоточусь на рассматриваемой проблеме. Кажется, вы делаете это намного сложнее, чем нужно: если вы хотите передать и форму, и слаг/URL в шаблон, вы просто помещаете их в контекст шаблона и передаете контекст render как обычно. Здесь нет ничего необычного или сложного.

return render(
    request,
    self.template_name,
    {'entry_comment_form':entry_comment_form, 'slug': slug}
)

Обратите внимание, что, вероятно, лучше передать slug в контексте и использовать тег url в шаблоне:

{% url 'entry_detail' slug=slug %}
person Daniel Roseman    schedule 11.12.2013
comment
Но это не имеет ничего общего с render. Это для рендеринга шаблона, отсюда и название. Почему вы вообще вызываете рендеринг? - person Daniel Roseman; 11.12.2013
comment
Однако вы все еще не объясняете, что вы надеетесь сделать с этими вещами. И вам нужно правильно объяснить, где находится этот код, в контексте: т. е. опубликовать фактическое представление, показывающее, где вы его вызываете и что вы надеетесь сделать с ответом. - person Daniel Roseman; 11.12.2013
comment
Извините, я не готов помочь вам дальше, если вы не покажете фактический код, который использует эту функцию, и полный код функции (не недопустимый фрагмент, как вы разместили сейчас). - person Daniel Roseman; 11.12.2013