Как создать динамический фильтр на основе первичного ключа ForeignKey в ListView? - PullRequest
1 голос
/ 25 июня 2019

Я относительно новичок в Django, но основная проблема, с которой я сейчас сталкиваюсь, заключается в создании ListView, который будет отображать загруженные документы на основе первичного ключа моего ForeignKey.

Я пробовал несколько способов создания фильтра и чтения онлайн-документации по представлению на основе классов, но, похоже, в нем нет соответствующей информации о том, как использовать первичный ключ моего ForeignKey в моем фильтре.

Это мои модели:

class Post(models.Model):
    title = models.CharField(max_length=100)
    image = models.ImageField(default = 'default0.jpg', 
upload_to='course_image/')
    description = models.TextField()
    price = models.DecimalField(decimal_places=2, max_digits=6)
    date_posted = models.DateTimeField(default=timezone.now)
    author = models.ForeignKey(User, on_delete=models.CASCADE)
    rating = models.IntegerField(default = 0)

    def __str__(self):
        return self.title

    def get_absolute_url(self):
        return reverse('post-detail', kwargs={'pk' : self.pk})

class Lesson(models.Model):
    title = models.CharField(max_length=100)
    file = models.FileField(upload_to="lesson/pdf")
    date_posted = models.DateTimeField(default=timezone.now)
    post = models.ForeignKey(Post, on_delete=models.CASCADE)

    def __str__(self):
        return self.title

    def get_absolute_url(self):
        return reverse('lesson_upload', kwargs={'pk': self.pk})

Вот мой ListView с фильтром, который не работает:

class LessonListView(ListView):
    model = Lesson
    template_name = 'store/uploaded_lesson.html'
    context_object_name = 'lesson'

    # def get_queryset(self):
    #   return Lesson.objects.filter(Post__pk=self.Post.pk)

    def get_queryset(self):
        self.post__pk = get_object_or_404(post__pk, 
name=self.kwargs['post__pk'])
        return Lesson.objects.filter(post__pk=self.post__pk)

Вот мой urls.py:

path('post/<int:pk>/lesson_uploaded/', LessonListView.as_view(), name='lesson_uploaded'),

Вот мой HTML:

{% extends "store/base.html" %}
{% block content %}
    <div id="main">
        <table class="table mb-0">
        <thead>
          <tr>          
            <th>Title</th>
            <th>Author</th>
        <th>Download</th>
        <th>Delete</th>
      </tr>
    </thead>
    <tbody>
      {% for lesson in lesson %}
      <tr>
        <td>
            {% if lesson.file %}
                <img src="{{ lesson.file.url }}"  style="width:100px;">
            {% else %}   
            {% endif %}
        </td>
      </tr>
      {% endfor %}
    </tbody>
  </table>
</div>
{% endblock %}

1 Ответ

1 голос
/ 25 июня 2019

Вы можете попробовать вот так:

В URL добавьте post_id:

path('lessons/<int:post_id>/', LessonListView.as_view()),

Затем обновите представление, чтобы получить метод post_id in get_queryset:

class LessonListView(ListView):
    model = Lesson
    template_name = 'store/uploaded_lesson.html'
    context_object_name = 'lesson'

    def get_queryset(self):
        return Lesson.objects.filter(post_id=self.kwargs.get('post_id'))

Также, пожалуйста, не называйте список и элемент этого списка в цикле for одинаковыми, поэтому обновите его до:

{% for l in lesson %}. // or anything other than lesson
    <tr>
        <td>
            {% if l.file %}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...