Как ссылаться на pk в DetailView

#django #filter #primary-key #detailview

#django #Фильтр #первичный ключ #detailview

Вопрос:

Привет, я уверен, что у этого было простое решение, но я не могу его найти! Это должно требоваться ПОСТОЯННО!

Чтобы изучить django, я пишу простое приложение для регистрации своих результатов обучения. Итак, у меня есть две модели:

 class Topic(models.Model):
    title = models.CharField(max_length=40)

    def __unicode__(self):
        return self.title

    class Meta():
        ordering = ['title']


class Fact(models.Model):
    note = models.CharField(max_length=255)
    topic = models.ForeignKey('Topic')

    def __unicode__(self):
        return self.note

    class Meta():
        ordering = ['note']
  

У меня есть шаблон и URL, в которых будут перечислены ВСЕ темы.

Когда я вижу этот список, я хочу иметь возможность щелкнуть по нему [что я могу сделать] и связать с ним эту тему и все факты (чтобы появился внешний ключ) [технически это можно описать как набор дочерних объектов с фильтрованным запросом?] Я использую detailview.

url

  url(r'^(?P<pk>d )/$', TopicDetailView.as_view(), name='facts'),
  

Вот код подробного представления. Знайте, я знаю, что он знает pk, поскольку он показывает нужную страницу, когда я удаляю фильтр extracontext (и просто беру .all()). Но я не могу ссылаться на это, сколько бы способов я ни пробовал. Я бы хотел что-то вроде этого…

 class TopicDetailView(DetailView):
    model = Topic
    template_name = 'study/topic_facts.html'

    def get_context_data(self, **kwargs):
        # Call the base implementation first to get a context
        context = super(TopicDetailView, self).get_context_data(**kwargs)
        # Add in a QuerySet of all the books

        context['fact_list'] = Fact.objects.filter(topic='pk')
        return context
  

Я могу сделать это, если добавлю некоторую логику и фильтр в шаблон, но мне это кажется не очень правильным, и я чувствую, что должен быть в состоянии сделать это легко, добавив правильный дополнительный контекст.

Помогите какому-нибудь бедному новичку! Большое спасибо.

Ответ №1:

'pk' это просто строка. Вы имеете в виду self.kwargs['pk'] .

Но на самом деле вы вообще не хотите этого делать. Суперкласс уже добавляет объект Topic в контекст: и у вас есть связь между темой и фактом. Вы можете просмотреть эту взаимосвязь в шаблоне:

 {% for fact in topic.fact_set.all %}
    ...
{% endfor %}
  

таким образом, вам не нужно переопределять get_context_data .