【问题标题】:Django - trouble with separating objects by user and dateDjango - 按用户和日期分隔对象的麻烦
【发布时间】:2017-02-25 12:54:48
【问题描述】:

所以我有这些模型:

excercises_choices = (('Bench Press', 'Bench press'),('Overhead Press', 'Overhead Press'), ('Squat', 'Squat'),
                ('Deadlift', 'Deadlift'))

unit_choices = (('kg','kg'), ('lbs', 'lbs'))


class Lifts(models.Model):

 user = models.ForeignKey('auth.User', null=True)
 excercises = models.CharField(max_length=200, choices=excercises_choices)
 sets = models.IntegerField(null=True, blank=True)
 reps = models.IntegerField(null=True, blank=True)
 weight = models.FloatField()
 unit = models.CharField(max_length=3, choices=unit_choices)
 created_date = models.ForeignKey('Dates')
 amrap_set = models.BooleanField(default=False)
 amrap_rep = models.IntegerField(null=True, blank=True)

def __str__(self):
    return self.excercises


class Dates(models.Model):
 created_date = models.DateField(unique=True)

def __str__(self):
    return str(self.created_date)

假设我在不同日期为管理员提供了很少的电梯,而为 xx 用户提供了不同的电梯。 我想要多个电梯匹配一个日期,这就是我制作外键的原因。 (例如,2016 年 10 月 10 日的 3 次升降机和 2016 年 10 月 11 日的 2 次升降机)。

这是一个展示它的视图:

 @login_required
 def entries(request):
  date = Dates.objects.all().order_by('-created_date')
  lifts_by_user = Lifts.objects.filter(user=request.user)
  return render(request, 'lift/entries.html', {'date': date,
                                             'lifts_by_user': lifts_by_user})

和模板:

{% extends 'lift/base.html' %}

{% block content %}
{{ user }}


{% if user.is_authenticated %}

{% for date in date %}
    <p><strong><a href="{% url 'lift_date' pk=date.pk %}">{{ date }}</a></strong>
    {% for i in date.lifts_set.all %}
        {{ i }}

    {% endfor %}

<a href="{% url 'new_lifts' %}">add new lift</a></p>
{% endfor %}
{% endif %}
<p>
<a href="{% url 'entries_delete' %}">Delete lifts or dates </a>
</p>
{% endblock %}

问题是我不知道如何按日期和用户分开它。 This is how it looks like我如何保持这个模式日期 - lifts_to_that_date 但对于单独的用户?我不想在测试用户时看到管理员的条目

【问题讨论】:

    标签: python django web-applications django-models django-templates


    【解决方案1】:

    看看regroup 模板标签,它正是你所需要的。

    你可以在你的视图中做这样的事情:

    @login_required
    def entries(request):
        lifts_by_user = (Lifts.objects.filter(user=request.user)
            .order_by('-created_date__created_date'))
        return render(
            request,
            'lift/entries.html',
            {'lifts_by_user': lifts_by_user}
        )
    

    并将模板中的 for date in dates 循环替换为以下内容:

    {% regroup lifts_by_user by created_date.created_date as lifts %}
    <ul>
        {% for day in lifts %}
            <li>Date: {{ day.grouper }}
                <ul>
                    {% for lift in day.list %}
                        <li>{{ lift }}</li>
                    {% endfor %}
                </ul>
            </li>
        {% endfor %}
    </ul>
    

    我在这里使用了ul,以便更容易与文档中的示例进行比较,但显然您可以将标记更改为您需要的任何内容。重要的是要知道 regroup 不会对其输入进行排序,因此您需要在视图中按 created_date 排序。

    如果您使用的是 Django 的开发版本,您可以使用它:

    {% regroup lifts_by_user by created_date.created_date as lift_list %}
    <ul>
        {% for day, lifts in lift_list %}
            <li>Date: {{ day }}
                <ul>
                    {% for lift in lifts %}
                        <li>{{ lift }}</li>
                    {% endfor %}
                </ul>
            </li>
        {% endfor %}
    </ul>
    

    我觉得比较清楚一点。

    顺便说一句,这些都不依赖于将日期存储为外键,但这取决于您。

    来自 cmets 的问题:

    1. order_by('-created_date__created_date') 正在通过 Lifts.c​​reated_date 外键将 Lifts 加入 Dates,并按 Dates.created_date 字段排序。详情请查看https://docs.djangoproject.com/en/dev/topics/db/queries/#lookups-that-span-relationships

    2. for day, lifts in lift_list 正在使用元组解包。 举个简单的例子:

      t = (1, 2, 3)
      # first, second, third will have values 1, 2, 3 respectively
      first, second, third = t
      

      {% regroup lifts_by_user by created_date.created_date as lifts_list %} 生成namedtuples 的列表(同样,仅在开发版本中,如果您使用的是 1.10 或更早版本,它是一个字典列表,因此您不能使用此技巧)所以当您迭代时通过lift_list,您可以将电梯的日期和列表解压缩到单独的变量中。

    3. 如果您有一个名为 lift 的 Lift 实例,您可以使用 lift.created_date_id 获取其日期的 pk。在示例模板中有日期 URL 的位置访问它有点棘手,因为您必须从重新组合的日期列表中获得提升。像这样的:

      {% regroup lifts_by_user by created_date.created_date as lifts %}
      <ul>
          {% for day in lifts %}
              <li>Date: {{ day.grouper }}
                  {# day.list.0 gets the first lift for this day #}
                  Date PK: {{ day.list.0.created_date_id }}
                  <ul>
                      {% for lift in day.list %}
                          <li>{{ lift }}</li>
                      {% endfor %}
                  </ul>
              </li>
          {% endfor %}
      </ul>
      

    【讨论】:

    • order_by('-created_date__created_date') 是做什么的?这对于一天来说究竟是如何工作的?它将日期和电梯名称作为单独的变量?最后一个问题,你认为我不需要日期作为外键吗?我不太擅长创建数据库
    • 哦,最后一个问题。如何从此模板中获取日期的 pk?我需要从日期到另一个基于日期的更详细视图的主键
    • @Delyew 我只能根据你在这里所说的话来判断,因为我对你的网站一无所知,但我会说将日期作为外键只会使事情复杂化,而且不会不给你任何好处。我将尝试通过编辑答案来回答您的其他问题,而不是尝试在 cmets 中进行。
    猜你喜欢
    • 1970-01-01
    • 2017-12-04
    • 2015-01-27
    • 2020-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-01
    相关资源
    最近更新 更多