Как я могу запросить менеджеров моделей в моих представлениях на основе функций для single_page (detail.html) - PullRequest
0 голосов
/ 06 мая 2019

Мне трудно запросить собственный менеджер моделей django в подробном представлении моей функции.Как я могу решить эту проблему?

Я использую django 2.2.

в моем файле models.py, у меня есть этот код ниже, который отлично работает.Запросы для просмотра списка работают нормально, и когда я запрашиваю подробный вид с помощью get_object_or_404 (Modelname, id), подробные представления тоже работают, но когда я пытаюсь запросить его с помощью моего собственного менеджера моделей, я продолжаю получать эту ошибку "movie_detail () получилнеожиданный аргумент ключевого слова 'id' ".

Я также пытался удалить --->

    def get_absolute_url(self):
        return reverse('core:movie_detail', args=[self.id,])

из моей модели фильма при запросе менеджера модели, но все равно получаю ту же ошибку

Как мне решить эту проблему?

my models.py

class MovieManager(models.Manager):

    def all_with_related_persons(self):
        qs = self.get_queryset()
        qs = qs.select_related('director')
        qs = qs.prefetch_related('writers', 'actors')
        return qs

class Movie(models.Model):
    NOT_RATED   =   0
    RATED_G     =   1
    RATED_PG    =   2
    RATED_R     =   3
    RATINGS     =   (
                    (NOT_RATED, 'NR - Not Rated'),
                    (RATED_G, 'G - General Audiences'),
                    (RATED_PG, ' PG - Parental Guidance' 'Suggested'),
                    (RATED_R, 'R - Restricted'),
                )
    title       =     models.CharField(max_length=140)
    plot        =     models.TextField()
    year        =     models.PositiveIntegerField()
    rating      =     models.IntegerField(choices=RATINGS, default=NOT_RATED)
    runtime     =     models.PositiveIntegerField()
    website     =     models.URLField(blank=True)
    director    =     models.ForeignKey(to='Person',
                                    on_delete=models.SET_NULL,
                                    related_name="directed",
                                    null=True,
                                    blank=True)
    writer      =     models.ManyToManyField(to="Person", related_name="writing_credits", blank=True)
    actors      =     models.ManyToManyField(to="Person", through="Role", related_name="acting_credits", blank=True)
    objects     =     MovieManager()

    def __str__(self):
        return '{} ({})'.format(self.title, self.year)

    def get_absolute_url(self):
        return reverse('core:movie_detail', args=[self.id,])

    class Meta:
        ordering = ('-year', 'title',)

<--- Views.py --->

Мой списокview

def movie_list(request):
    object_list =   Movie.objects.all()
    paginator = Paginator(object_list, 12)
    page_number = request.GET.get('page', 1)
    try:
        page = paginator.page(page_number)
    except PageNotAnInteger:
    # If page is not an integer deliver the first page
        page = paginator.page(1)
    except EmptyPage:
    # If page is out of range deliver last page of results
        page = paginator.page(paginator.num_pages)
    context     =   {
                    'object_list': object_list,
                    'products': page,
                    'page': page,
                }
    template    =   'core/movie_list.html'
    return render(request, template, context)

DetailView без настраиваемого менеджера моделей. (Это работает)

def movie_detail(request, id):
    object_list = get_object_or_404(Person, id=id)
    context     =   {'movie': object_list}
    template    =   'core/person_detail.html'
    return render(request, template, context)

DetailView с настраиваемым менеджером моделей. (Это не работает. Выдает ошибку "movie_detail () получилнеожиданный аргумент ключевого слова 'id' ")

def movie_detail(request):
    object_list =   Movie.objects.all_with_related_persons()
    context     =   {'movie': object_list}
    template    =   'core/movie_detail.html'
    return render(request, template, context)

Мой путь к URL-адресу detail_view

path('<id>/', views.movie_detail, name="movie_detail"),

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

1 Ответ

0 голосов
/ 06 мая 2019

Ваш шаблон URL для представления movie_detail передает id kwarg вашему представлению, поэтому вашему представлению необходимо принять id в качестве аргумента.Вместо

def movie_detail(request)

вы должны определить

def movie_detail(request, id)

Ошибка, которую вы видите, просто говорит: movie_detail был вызван с ключевым аргументом id, то есть он был назван так: movie_detail(request=the_request, id=some_id), который не может работать, если определено, что он имеет только один аргумент, request.

Но также, поскольку вы создаете подробный вид для одного объекта, вы, вероятно, должны что-то сделать с id для выбора конкретного объекта:

def movie_detail(request, id):
    object_list = Movie.objects.all_with_related_persons()
    try:
        movie = object_list.get(id=id)
    except Movie.DoesNotExist:
        raise Http404
    context     =   {'movie': movie}
    template    =   'core/movie_detail.html'
    return render(request, template, context)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...