Какой-то модели с идентификатором «xx» не существует. Возможно, он был удален?

#python #django #postgresql #django-admin

Вопрос:

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

введите описание изображения здесь

Но когда я перехожу по этому URL (тот же URL) в разделе «Администратор» ниже, это работает очень хорошо:

 http://localhost:8000/en/admin/accounts/cooperationemployee/25/change/
 

Поэтому мне интересно, что вызывает эту проблему, но Id она существует в базе данных.

Модель сотрудничества с сотрудником :

 class CooperationEmployee(models.Model):
    cooperation_employee_id = models.CharField(
    _('Cooperation Employee ID'), max_length=64, blank=True, null=True)
    international_prefix = CountryField(
        _('International prefix'), null=True, blank=True)
    phone_number = models.CharField(_('Telephone Nr'), max_length=20)
    branch = models.CharField(
        _('Relevant branch'), max_length=50, blank=True, 

null=True)
email_user = models.OneToOneField(
        EmailUser, on_delete=models.CASCADE,
        related_name='cooperation_employee_profile',
        verbose_name=_('Email user'))
 

Моя база данных показывает это, идентификатор доступен (Postgres) :

введите описание изображения здесь

На странице администратора для сотрудника Cooperation есть следующее :

 def has_change_permission(self, request, obj=None):
        """Permissions to change account settings."""
        if request.user.role == ROLE_COOPERATION_EMPLOYEE:
            return True
        return False
 

Роль ROLE_COOPERATION_EMPLOYEE предназначена для приведенной выше модели.

Редактировать :

Это набор запросов :

 user_id = EmailUser.objects.get(
            id=request.user.id).cooperation_employee_profile.id
 

Модель для пользователя электронной почты :

 class EmailUser(AbstractBaseUser, PermissionsMixin):

    email = models.EmailField(_('Email'), unique=True)
    first_name = models.CharField(_('First Name'), max_length=64)
    last_name = models.CharField(_('Last Name'), max_length=64)
    role = models.CharField(
        _('Role'), max_length=2, choices=ROLE_CHOICES, null=True, blank=True)
 

Итак, полный код маршрута выглядит следующим образом :

 class CooperationPartnerGenericChangeView(ListAPIView):

  
    def list(self, request, *args, **kwargs):
       
        
        url = 'adminsite:accounts_cooperationemployee_change'
        user_id = EmailUser.objects.get(
            id=request.user.id).cooperation_employee_profile.id

        return HttpResponseRedirect(
            reverse(url, kwargs={'object_id': user_id})   '?edit=1')
 

записка:

Это обратный URL adminsite:accounts_cooperationemployee_change -адрес . для http://localhost:8000/en/admin/accounts/cooperationemployee/25/change/

Комментарии:

1. Возможно, для получения ошибки используется отфильтрованный набор запросов. Не могу сказать, потому что вы не поделились многими подробностями о представлении, в котором произошла ошибка.

2. @4140tm, набор запросов возвращает 25, даже когда я явно добавляю его туда, он должен направлять, но это не так, позвольте добавить наборы запросов, и вы увидите.

3. @4140tm, я добавил больше кода, чтобы увидеть, что происходит на самом деле, надеюсь, это имеет смысл для вас.

Ответ №1:

Есть несколько вещей, которые я хотел бы затронуть, которые не вписываются в комментарий:

  1. Вы используете list представление одной модели для перенаправления на представление изменения той же модели с использованием идентификатора из другой модели. Это все, что делает представление списка, согласно этому фрагменту.
  2. Этот набор запросов не является местом, где происходит ошибка. Это также кажется излишним — вы используете идентификатор текущего пользователя, чтобы получить EmailUser идентификатор, а затем передаете идентификатор возвращенного объекта в другое представление. Ты мог бы просто пройти request.user.id мимо . Но как вы можете быть уверены, что идентификаторы объектов EmailUser и CooperationEmployee объектов будут совпадать?
  3. Похоже, ошибка возникает в представлении, на которое вы перенаправляете, и есть соответствующий набор запросов, который вам нужно проверить.

Комментарии:

1. Спасибо за ответ, но у меня был неправильный набор запросов, за то EmailUser , что я его отредактировал. Итак , вопрос в том, как отладить эту ошибку в шаблоне

2. В ListAPIView я только перенаправлял : HttpResponseRedirect( reverse(url, kwargs={'object_id': user_id}) '?edit=1') будет ли это проблемой?

3. Я вижу правку, и теперь она немного более ясна. Кстати, вы могли бы использовать cooperation_employee_profile_id вместо cooperation_employee_profile.id этого в данном случае, чтобы выполнить на один запрос меньше БД. Однако я не уверен, что вы подразумеваете под отладкой в шаблоне. Это то, что вам нужно отлаживать в python — именно там выполняется код. Шаблон находится в конце процесса и получает вычисленные значения

4. Что касается представления списка — это представление списка, обычно используемое для перечисления элементов. Если вы собираетесь ограничить его одним предметом, лучше используйте DetailView его . Поскольку это всего лишь перенаправление, вы также можете использовать a RedirectView . И поскольку вы знаете, что этот URL будет перенаправлять, почему бы не отправить пользователя непосредственно на конечный URL? Кажется, что между ними больше ничего не происходит.

5. Хорошо, спасибо за дополнительные просмотры, давайте их протестируем. Но что я делаю, так это получаю сгенерированный URL-адрес и передаю его тегу привязки.