#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:
Я не знаю, работаете ли вы все еще над этим, но
- Я не согласен с привязкой BankStatement к пользователю как ManyToMany. На мой взгляд, у одного пользователя может быть много операторов, но у одного оператора есть только один пользователь. Таким образом, это отношение «один ко многим», определяемое внешним ключом.
- Давайте исправим представление:
@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 .