Поиск текущего имени модели, используемой в представлении на основе классов, а затем использование его в качестве одного из двух параметров фильтра - PullRequest
0 голосов
/ 18 июня 2020

Моя проблема в том, что я пытаюсь найти имя модели, которая в настоящее время используется в подробном представлении на основе классов, а затем использую это имя в качестве одного из двух параметров поиска (модель, используемая в представлении на основе классов, является внешним ключом другой модели, которую я пытаюсь фильтровать)

Не могу понять, как узнать, как фильтровать по текущей используемой модели.

Вот мой models.py

class MyProjects(models.Model):
    title = models.CharField(max_length=30)
    description = models.CharField(max_length=140)

class Post(models.Model):

    title = models.CharField(max_length=50)
    content = models.TextField()
    project = models.ForeignKey(MyProjects, on_delete=models.CASCADE, null=True, default=None)

А вот и мой views.py

class ProjectView(DetailView):
    model = MyProjects


    def get_context_data(self, **kwargs):
        CurrentProject = get_object_or_404(MyProjects, title=self.kwargs['MyProjects'])
        completed = Post.objects.filter(status='Completed', project= CurrentProject)
        inProgress = Post.objects.filter(status='InProgress', project= CurrentProject)
        posts = Post.objects.filter(project= CurrentProject)
        Features = Post.objects.filter(ticket_type='Features', project= CurrentProject)

        context = super().get_context_data(**kwargs)
        context['posts '] = posts 
        context['Features '] = Features 
        context['completed '] = completed 
        context['inProgress '] = inProgress 
        context['projects'] = projects


        return context

Спасибо

1 Ответ

0 голосов
/ 19 июня 2020

Я думаю, вы неправильно используете DetailView, но вы находитесь на правильном пути.

Важно помнить, что self.object ссылается на объект, над которым работает представление. В вашем коде вы называете его CurrentProject, поэтому нет необходимости запрашивать объект, он у вас уже есть. В общем случае вы передаете идентификатор объекта в представление в качестве параметра URL.

Заключение ...

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

class ProjectView(DetailView):
    model = MyProjects

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

        completed = Post.objects.filter(status='Completed', project=self.object)
        in_progress = Post.objects.filter(status='InProgress', project=self.object)
        posts = Post.objects.filter(project=self.object)
        features = Post.objects.filter(ticket_type='Features', project=self.object)

        context['posts'] = posts 
        context['features'] = features 
        context['completed'] = completed 
        context['inProgress'] = in_progress 
        context['projects'] = projects

        return context

И URL-адрес представления должен выглядеть примерно так:

path('<int:pk>/', views.ProjectView.as_view(), name='project-detail')
...