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

#python #django #django-models #django-views

Вопрос:

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

То, что я пытаюсь сделать:-

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

models.py

 class Profile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE,default='',unique=True)
    block_users = models.BooleanField(choices=BLOCK_CHOISES,default=False)
 

Проблема

 def block_users(request):
    profile = request.user.profile
    blocked = Profile.objects.filter(block_users=profile.block_users)

    context = {'blocked':blocked}
    return render(request, 'blocked.html', context)
 

Когда я запускаю этот код, он показывает мне только пользователя, значение которого равно False . НО я хочу, чтобы пользователи имели такую ценность True .

Я понятия не имею, как его получить.

заранее спасибо.

Любая помощь будет признательна.

Ответ №1:

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

вместо этого: В вашем models.py, создайте связанное имя

 class Profile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE, related_name="profile_user",unique=True)
    block_users = models.BooleanField(choices=BLOCK_CHOISES,default=False)
 

В views.py, когда вы сделаете «запрос.user.profile_user.block_users», это даст зарегистрированным пользователям статус блокировки.

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

 Profile.objects.filter(block_users=True)
 

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

1. Большое Вам спасибо за ваши усилия. НО вы хотите, чтобы я поставил request.user.profile_user.block_users перед этим ?

2. Это зависит от тебя. Если вам нужен статус вошедших пользователей и вы хотите использовать его в дальнейшем, вы можете добавить его. Но если вы хотите указать только заблокированного пользователя, фильтрация с помощью True сделает свое дело. Нет необходимости в запросе.user.profile_user.block_users. в этом случае

3. НО я хочу показать заблокированным пользователям, которые заблокированы пользователем, вошедшим в систему.

4. Тогда это будет совершенно другой сценарий. Добавьте в свою модель еще одно поле с именем blocked_by(это поможет вам найти, кто кого заблокировал). Это будет внешний ключ к пользовательской модели. Измените логику того, как вы вставляете в свою модель. Когда вы хотите получить данные, вы можете выполнить: Profile.objects.filter(block_users=True,blocked_by=request.user.profile_user).