#django
#django
Вопрос:
У меня есть приложение, которое я разрабатываю, у которого есть 2 типа пользователей (A и B), и у меня есть страница, на которую я хочу перенаправлять пользователей, не прошедших проверку подлинности, и не типа B. Тип пользователя задается в реляционной базе данных.
Мои две таблицы db для этого
User - pk, etc...
Profile - pk, uid (user pk), account_type
Что я сделал до сих пор:
Я уже использовал @login_required
в своем views.py
документе для успешной проверки подлинности.
Я могу фильтровать содержимое, для которого pid задан вручную: Profile.objects.filter(user__pk=1)
И я могу получить текущий идентификатор пользователя с помощью request.user.id
С чем я борюсь
Что я попытался сделать, так это создать условие, где я использую request.user.id
с фильтром, чтобы найти этого пользователя, а затем проверить тип учетной записи. Я не уверен, как извлечь account_type
и на данный момент мой код становится беспорядочным и, вероятно, неэффективным. Я искал это, но все, что я нашел, используя приведенные здесь ключевые слова, выявило проблемы, отличные от тех, которые я пытаюсь решить.
Отредактированная дополнительная информация
У меня здесь используются 2 приложения, 1 — это accounts
одно listings
, страница, для которой я это делаю, предназначена для публикации списка, который находится в listing
приложении; Я хочу, чтобы только один тип пользователя (B) мог его опубликовать.
в учетных записях у меня есть этот класс:
class Profile(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
location = models.CharField(max_length=30, blank=True)
account_type = models.CharField(max_length=30)
В приложении listing я еще не создал соответствующую модель, насколько я понимаю, эта фильтрация будет происходить в представлении.
В представлении, которое я делаю:
@login_required
def post(request):
current_user = request.user
if : #here is where I want to filter, but haven't been able to get it to work
else:
return redirect('index')
Комментарии:
1. Отправьте код для дальнейшего понимания
2. Можете ли вы показать нам модели?
3. И запросы, которые вы используете?
4. У каждого пользователя есть профиль? Если это так, вы должны быть в состоянии сделать:
if user.profile.account_type != "B":
. В противном случае вам придется перехватыватьUserProfile.DoesNotExist
и использовать поведение по умолчанию.
Ответ №1:
Вы получите значение типа учетной записи непосредственно как
account_type = request.user.profile.account_type
Таким образом, вы могли бы выполнять действия в соответствии со account_type
значением, как показано ниже,
@login_required
def post(request):
account_type = request.user.profile.account_type
if account_type == "B"
# do your stuff
else:
return redirect('index')
Ответ №2:
Начиная с вашего дизайна модели, если в вашей системе есть критерии, по которым у одного пользователя есть только один профиль. Затем установите uid в модели профиля как OneToOneField, чтобы вы могли легко получить доступ к account_type с помощью User.objects.filter(id=request.user.id).profile.account_type
.
В противном случае, если в вашей системе есть критерии, по которым у одного пользователя может быть несколько профилей. Затем вам сначала нужно получить доступ к it profiles и выбрать конкретный профиль, добавив дополнительный фильтр, затем вы получаете доступ к account_type:
User.objects.filter(id=request.user.id).profile_set.all()
предоставляет полный профиль пользователя.
User.objects.filter(id=request.user.id).profile_set.get(your_filter)
предоставляет вам конкретный профиль пользователя.
User.objects.filter(id=request.user.id).profile_set.get(your_filter).account_type
предоставляет вам доступ к account_type профиля конкретного пользователя.