Django当前登录用户的查询集

3
我從我的模型中進行查詢集。 現在,查詢集正在顯示HTML頁面中的所有數據。 但是我想只顯示已登錄用戶的數據。 models.py
class Data(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
Status = models.CharField(max_length=10, blank=False)
Date = models.DateField(blank=True, null=True)

views.py

@login_required
def search(request):
    status_list = Data.objects.all()
    status_filter = UserFilter(request.GET, queryset=status_list)
    return render(request, 'users/data.html', {'filter': status_filter})

filters.py

class UserFilter(django_filters.FilterSet):

class Meta:
    model = Data
    fields = {
        'Date': ['year','month', ], 'user': ['exact', ],
    }

我尝试过不同的 views.py 文件,但是没有起作用。

@login_required
def search(request, user):

    status_list = Data.objects.get(user=self.request.user).search(query)
    status_filter = UserFilter(request.GET, queryset=status_list)
    return render(request, 'users/data.html', {'filter': status_filter})

data.html

<!DOCTYPE html>
{% load django_tables2 %}
{% load staticfiles %}
<html lang="en" dir="ltr">
  <head>
    <meta charset="utf-8">
    <title></title>

  </head>
  <body>

{% block content%}


      <form method="get">
        {{ filter.form.as_table }}
        </select>
        <button type="submit" class="btn btn-primary">
        <span class="glyphicon glyphicon-search"></span> Search
      </button>
      </form>
      <ul>
        {% for user in filter.qs %}
        <li>{{ user.username }} - {{ user.get_full_name }}</li>
        {% endfor %}
      </ul>

    <table id="datatable" style="margin-top: 20px" style="margin- 
    bottom:20px" class="table table-bordered" >
    <thead>
      <tr>
        <th>user</th>
        <th>EndDate</th>
        <th>Status</th>

      </tr>
    </thead>
    <tbody>
      {% for Data in filter.qs %}
        <tr>
          <td>{{ Data.user }}</td>
          <td>{{ Data.EndDate }}</td>
          <td>{{ Data.Status }}</td>
        </tr>
      {% empty %}
        <tr>
          <td colspan="5">No data</td>
        </tr>
      {% endfor %}
    </tbody>
    </table>


{% endblock content%}



  </body>

我在上面添加了我的HTML代码,请您也查看一下HTML代码。


什么是“数据”模型? - Willem Van Onsem
你说的“没用”是什么意思?能详细说明一下哪里有问题吗?有没有出现错误提示?【询问】 - Håken Lid
4个回答

3

有更好的方法来做这个。因为你还在学习,所以以下代码可以解决问题。

@login_required
def search(request, *args, **kwargs):
    status_list = Data.objects.get(user=request.user)

    month = request.GET.get("month", None)
    year = request.GET.get("year", None)

    if month:
        status_list = status_list.filter(Date__month=month)

    if year:
        status_list = status_list.filter(Date__year=year)

    return render(request, 'users/data.html', {'filter': status_list})

不可迭代意味着您无法使用for循环遍历该对象。请使用模板中的代码{{ filter }}检查filter的值。它显示了什么? - RyuCoder
我在表格中添加了更多数据。当我尝试上述提到的答案时,出现了错误。get()返回了不止一个Track -- 它返回了3个! - Viswanathan L
使用filter()代替get(),状态列表 = Data.objects.filter(user=request.user) - RyuCoder
我尝试使用{{ filter }},在我的HTML页面中显示如下:<QuerySet [<Track: Track object (2)>, <Track: Track object (6)>]>。 - Viswanathan L
嘿,我为年份和月份创建了搜索框。我尝试了以下代码:@login_required def search(request, *args, **kwargs): status_list = Data.objects.filter(user=request.user) status_filter = UserFilter(request.GET, queryset=status_list) return render(request, 'users/data.html', {'filter': status_filter}) - Viswanathan L
显示剩余11条评论

2
你可以简化你的代码,Django提供了许多帮助程序员的辅助函数。
在你的views.py中,你可以这样做:
@login_required
def search(request):
    status_list = Data.objects.all()
    status_filter = status_list.filter(user=request.user) //get current user id
    return render(request, 'users/data.html', {'filter': status_filter})

如果您需要在模板中转换日期时间(月份,年份),您可以使用默认过滤器dajngo date:{{ field|date:"Y-m-d" }} - Ricardo Prado
为什么要先获取数据库中的所有条目,然后再筛选出当前用户的条目?这不是一个两步过程吗? - RyuCoder
status_list = Data.objects.all() 第一个过程 - 所有全局数据,status_filter = status_list.filter(user=request.user) 第二个过程 - 所有特定用户的数据。而且你仍然可以使用 status_list 作为默认用户数据,在其他变量中使用它。 - Ricardo Prado
是的,你说得对。如果需要使用相同的 ORM 查询并应用其他过滤器,那么将其分为两个步骤才有意义。否则,在一个 ORM 查询中进行筛选更有意义。 - RyuCoder
嗨,谢谢你抽出时间。我也尝试了这段代码,但是之前用我的代码它能显示所有用户数据,现在却没有显示任何数据。还有其他可能的解决方案吗? - Viswanathan L
请放置您的实际代码,并验证用户是否已登录。 - Ricardo Prado

2
status_list = Data.objects.get(user=self.request.user) 

使用self只能在基于类的视图中使用,所以使用它在此处是错误的。难怪它没有起作用。 请改用以下代码:

status_list = Data.objects.filter(user=request.user) or 
status_list = Data.objects.get(user=request.user)

所以,最终的代码将会是这样的:
@login_required
def search(request):
    status_list = Data.objects.get(user=request.user)
    render(request, 'users/data.html', {'filter': status_list})

嗨,感谢您的评论。我尝试了这段代码,但它没有在我的HTML页面中显示任何数据。 - Viswanathan L
你在HTML模板中使用了正确的变量名来迭代吗?在这种情况下,变量名应该是filter。此外,你必须确保数据库中有一些条目属于当前登录用户的名为Data的表。 - RyuCoder
检查当前登录用户的主键(pk)。将以下代码粘贴到上面的函数中:print(request.user.pk)。您也可以使用以下代码:print(request.user.id)。然后在数据库表Data中检查是否有与pk或id值相关联的条目。 - RyuCoder
{{ user.username }} 我使用这个代码在 HTML 页面中打印我的登录用户名,它能正确地打印出用户名。 - Viswanathan L

1
下面的代码应该可以正常工作。
 {% for data in filter %}
     <li>{{ data.user.username }} - {{ data.user.get_full_name }}</li>
 {% endfor %}

 {% for Data in filter %}
    <tr>
      <td>{{ Data.user }}</td>
      <td>{{ Data.Date }}</td>
      <td>{{ Data.Status }}</td>
    </tr>
  {% empty %}

由于您不会使用过滤器,因此应删除filters.py。
这也无法正常工作。根据需要进行更改。 {{ filter.form.as_table }}

嘿,我还有一个问题,你能帮我吗? - Viswanathan L
好的,请告诉我需要翻译什么 :) 现在是睡觉时间了,我可能会在明天早上回复 :P - RyuCoder
没问题。当你有空的时候,看一下这个。 - Viswanathan L
下拉菜单似乎是更好的选择,因为月份有预定义的名称。年份也是如此。 - RyuCoder
好的,怎么编写那个查询? - Viswanathan L
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接