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

#python #django

#python #django

Вопрос:

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

Вариант 1: я добавил в модель отношение manytomany для пользователя. При входе в систему в интерфейсе администратора я могу назначить пользователю банковскую выписку.

Вопрос: Каков правильный способ определения views.py или html-файл, чтобы показывать банковскую выписку только вошедшему в систему пользователю.

models.py

 class BankStatement(models.Model):
    
    user = models.ManyToManyField(settings.AUTH_USER_MODEL,related_name='bs')
    name = models.CharField(max_length=20)
    date_created = models.DateTimeField(auto_now_add=True)
    last_updated = models.DateTimeField(auto_now=True)
 

views.py

 @login_required(login_url="/login/")
def bankstatement_detail(request, bankstatement_id):
    bankstatement = BankStatement.objects.get(pk=bankstatement_id)   
    context = {
                'bankstatement': bankstatement,                         
            }            
    return render(request, 'administration/bankstatement_detail.html', context)
@login_required(login_url="/login/")
    def index_bankstatement(request):
        user = request.user
        bankstatement = BankStatement.objects..filter(user=request.user) 
        context = {
                    'bankstatement': bankstatement,                         
                }            
        return render(request, 'administration/bankstatement_detail.html', context)
 

bankstatement_detail.html

 <div class="card-block table-border-style">
   <div class="table-responsive">
      <table class="table table-hover">
          <thead>
             <tr>
               <th>#</th>
               <th>Name</th>
               <th>Date Created</th>
               <th>Last Updated</th>
              </tr>
           </thead>
           <tbody>
            {% for bankstatement in bankstatements %}
             <tr>
               <td>{{ bankstatement.id }}</td>
               <td>{{ bankstatement.name }}</td>
               <td>{{ bankstatement.date_created }}</td>
               <td>{{ bankstatement.last_updated }}</td>
            </tr>
            {% endfor %}                              
        </tbody>
     </table>
  </div>
</div>
 

Большое спасибо

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

1. Я думаю, вы должны делать это в представлениях, а не в моделях. Проверьте документы: docs.djangoproject.com/en/3.1/topics/auth . И google пример аутентификации Django.

2. Хороший пример введения: thecodinginterface.com/blog/django-auth-part1

Ответ №1:

Я не знаю, работаете ли вы все еще над этим, но

  1. Я не согласен с привязкой BankStatement к пользователю как ManyToMany. На мой взгляд, у одного пользователя может быть много операторов, но у одного оператора есть только один пользователь. Таким образом, это отношение «один ко многим», определяемое внешним ключом.
  2. Давайте исправим представление:
 @login_required(login_url="/login/")
def bankstatement_detail(request, bankstatement_id):

    # this line forces to show the statement of the logged in user
    user = request.user

    bankstatement = BankStatement.objects.get(pk=bankstatement_id, user=user)   
    context = {'bankstatement': bankstatement,}    
        
    return render(request, 'administration/bankstatement_detail.html', context)
 

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

1. Спасибо вам за это, я застрял в этой проблеме и не добился никакого прогресса. Я обновлю свой код. Один вопрос, я добавил ‘index_bankstatements’ в свой пост. Это правильно написано или мне нужно использовать ‘get ()’ вместо ‘filter ()’? Большое спасибо

2. Нет, это не кажется правильным: насколько я понимаю, вам нужно создать два представления (а) подробное представление инструкций и (б) список пользовательских инструкций. Проблема связана с вашим шаблоном: вы используете один и тот же шаблон для подробного представления инструкции и для представления списка инструкций, кроме того, шаблон bankstatement_detail.html на самом деле должен служить bankstatemen_list.html .