#django #django-models #django-views #django-forms #django-templates
#django #django-модели #django-представления #django-forms #django-шаблоны
Вопрос:
Я хочу получить общее количество таблиц, принадлежащих каждому пользователю в моем приложении. использование Tables.objects.all().count
возвращает все общее количество таблиц, но я хотел бы получить количество таблиц, принадлежащих каждому пользователю.
models.py
class User(AbstractBaseUser, PermissionsMixin):
name = models.CharField(max_length=30, blank=True, null=True)
class Bar(models.Model):
user_id = models.OneToOneField(User, on_delete=models.CASCADE)
name = models.CharField(max_length=50)
class Tables(models.Model):
table_no = models.CharField(max_length=14, unique=False)
bar = models.ForeignKey(to=Bar, on_delete=models.CASCADE)
views.py
def Dashboard(request, pk):
user = User.objects.get(pk=pk)
reservations = Tables.objects.filter(bar__user_id=user)
pending = Reservation.objects.filter(status="pending")
confirmed = Reservation.objects.filter(status="confirmed")
context = {"reservations":reservations, "pending":pending, "confirmed":confirmed}
return render(request, "dashboard/super/landlord/dashboard.html", context)
class Login(View):
""" Login View."""
form_class = LoginForm
template_name = "dashboard/auth/login.html"
def get(self, request):
logout(request)
form = self.form_class(None)
return render(request, self.template_name, {'form': form})
def post(self, request):
form = self.form_class(request.POST)
if form.is_valid():
Email = form.cleaned_data.get('Email')
password = form.cleaned_data.get('password')
user = authenticate(username=Email, password=password)
messages.success(request, "you have logged in successfully ")
if user is not None:
if user.is_active:
login(request, user)
return redirect('/dashboard')
else:
error = "Email or password is incorrect"
return render(
request, self.template_name, {'form': form, 'error': error})
urls.py
from django.urls import path
from .views import *
urlpatterns = [
path('dashboard/<int:pk>/', Dashboard, name="dashboard"),
]
templates.html
<li {% if request.path == '/dashboard/' %} class="active" {% endif %}><a href="{% url 'dashboard' user.pk %}"><i class="ion-home"></i> <span class="nav-label">Dashboard</span></a>
</li>
Ответ №1:
Майкл Линдсей в значительной степени ответил на ваш вопрос здесь, запрашивайте только нужного вам пользователя, например, если это было представление:
def all_user_tables(request, pk):
user = User.objects.get(pk=pk)
tables = Tables.objcets.filter(bar__user_id=user)
tables_count = tables.count()
return render(request, 'all_user_tables.html', {'user': user,
'tables': tables,
'tables_count': tables_count})
затем в вашем шаблоне:
{% extends 'base.html' %}
{% block content %}
<p>Tables for user {{ user }}</p>
{% for table in tables %}
{{ table }}
{% endfor %}
<p>Total {{ table_count }} tables.</p>
{% endblock %}
Комментарии:
1. Я пробовал это, но получаю сообщение об ошибке: «Обратный для «приборной панели» без найденных аргументов. попробовано 1 шаблон (ы): [‘dashboard/(?P<pk>[^/] )/$’]»
2. Я отредактировал коды, чтобы показать, что я сделал.
3. в ваших URL-адресах должно быть <int:pk> вместо <str:pk> и убедитесь, что при переходе на страницу вы передаете pk существующего пользователя
4. Я добавил template.html в моем коде. Это вызывает
"href="{% url 'dashboard' dashboard.pk %}""
у меня проблему.5. Я думаю, что это должно работать так же, как предлагаемое решение.
user = User.objects.get(pk=request.user.id); reservations = Tables.objects.filter(bar__user_id=user)
поскольку он ссылается на текущего зарегистрированного пользователя.
Ответ №2:
Двойные подчеркивания позволяют filter()
отслеживать отношения ForeignKey
user = User.objects.get(email="nasir@yahoo.com")
tbl_count = Tables.objects.filter(bar__user_id=user).count()
Комментарии:
1. когда я попробовал это, я получил сообщение об ошибке «Невозможно выполнить запрос»nasir@yahoo.com «: Должен быть экземпляр «User».»
2. Затем я попытался использовать «Tables.objects.filter(bar__user_id=user.id )». Он ничего не вернул
3. да, в этом примере сначала необходимо запросить экземпляр пользователя. Я могу добавить это к примеру.
4. пожалуйста, добавьте его, пожалуйста.