Как запрашивать только поля вошедшего в систему пользователя в Django?

#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. Это альтернативный способ.