#django #django-models #django-templates
#django #django-модели #django-шаблоны
Вопрос:
Итак, я использую модель, которая связана с моим пользовательским пользователем (AbstractUser) в Django. Я хочу перебрать все объекты текущего вошедшего в систему пользователя, которые принадлежат ему.
Итак, это модели:
class CustomUser(AbstractUser):
# Define all the fields
company = models.CharField(blank=True, null=True, max_length=150, unique=True)
email = models.EmailField(blank=True, null=True)
username = models.CharField(blank=True, null=True, max_length=150)
first_name = models.CharField(blank=True, null=True, max_length=150)
last_name = models.CharField(blank=True, null=True, max_length=150)
phone_number = models.CharField(max_length=15, blank=True, null=True)
kvk_number = models.IntegerField(blank=True, null=True)
vat_number = models.CharField(blank=True, null=True, max_length=150)
customer_type = models.CharField(max_length=1, choices=CUSTOMER_CHOICES, null=True, blank=True) # Choices are defined before the model
# Username is required here otherwise createsuperuser will throw a error. We define the usernamefield here as the email
REQUIRED_FIELDS = ['username', 'email']
USERNAME_FIELD = 'company'
def __str__(self):
return self.company
class UserLinks(models.Model):
# Define all the fields
user = models.ForeignKey(CustomUser, on_delete=models.CASCADE, null=True, blank=True)
name = models.CharField(max_length=2, choices=LINK_CHOICES, null=True, blank=True)
link = models.URLField(blank=True, null=True)
login_name = models.CharField(blank=True, null=True, max_length=150)
password = models.CharField(blank=True, null=True, max_length=150)
def __str__(self):
return self.name
class Meta:
verbose_name = "User link"
verbose_name_plural = "User links"
И это мое мнение:
def get(self, request):
user = CustomUser.objects.all()
return render(request, self.template_name ,{'user': user})
Затем, когда я хочу выполнить цикл по объектам с помощью foreingkey, я использую:
{% for entry in user %}
{{ entry.company }}
{{ entry.first_name }}
{% for a in entry.userlinks_set.all %}
{{ a.name }}
{{ a.link }}
{% endfor %}
{% endfor %}
Однако сейчас я отображаю все объекты, но я хочу отображать только объекты текущего вошедшего в систему пользователя, как это сделать?
Ответ №1:
Вы можете получить доступ к текущему вошедшему в систему пользователю по
request.user
хотя вы должны учитывать, что если пользователь не вошел в систему, это вернет AnonymousUser
. Вы можете предотвратить это, обернув свое представление login_required
декоратором.
Вы можете изменить свой код просмотра следующим образом:
def get(self, request):
return render(request, self.template_name ,{'user': request.user})
и код вашего шаблона должен выглядеть следующим образом
{{ user.company }}
{{ user.first_name }}
{% for a in user.userlinks_set.all %}
{{ a.name }}
{{ a.link }}
{% endfor %}
Ответ №2:
Вы можете получить доступ к вашему зарегистрированному пользователю через запрос в шаблоне
{% if not request.user.is_anonymous %}
{{request.user.company}}
{{request.user.first_name}}
{% for link in request.user.userlinks_set.all %}
{{link.name}}
{{link.link}}
{% endfor %}
{% endif %}
Комментарии:
1. Какой был бы лучший способ сделать это? Запрашивать пользователя или определять представление, в котором вы запрашиваете пользователя. Или вообще нет разницы?
2. Это альтернативный способ.