Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
基于另一个类python/django的初始化递增一个类的变量_Python_Django - Fatal编程技术网

基于另一个类python/django的初始化递增一个类的变量

基于另一个类python/django的初始化递增一个类的变量,python,django,Python,Django,我的目标是显示特定竞赛的参赛作品总数。最初,我尝试在模板部分中这样做,在循环输入条目时为每个竞赛增加一个计数器。我的想法是,当创建参赛作品提交时,相应竞赛的总提交量应该增加,但我不确定如何做到这一点 型号: class Contest(models.Model): contest_name = models.CharField(max_length=200) contest_description = models.CharField(max_length=5000) c

我的目标是显示特定竞赛的参赛作品总数。最初,我尝试在模板部分中这样做,在循环输入条目时为每个竞赛增加一个计数器。我的想法是,当创建参赛作品提交时,相应竞赛的总提交量应该增加,但我不确定如何做到这一点

型号:

class Contest(models.Model):
    contest_name = models.CharField(max_length=200)
    contest_description = models.CharField(max_length=5000)
    contest_start_date = models.DateTimeField('start date')
    contest_end_date = models.DateTimeField('end date')
    submission_count = models.IntegerField(default=0)

    def __str__(self):
        return self.contest_name


class Submission(models.Model):
    contest = models.ForeignKey(Contest, on_delete=models.CASCADE)
    user = models.ForeignKey(User, on_delete=models.SET_NULL, null=True, blank=True)
    date_uploaded = models.DateTimeField(auto_now_add=True)
    votes = models.IntegerField(default=0)

    def __init__(self):
        #increment the submission_count variable for the corresponding contest
使用模板的其他尝试:

<h1>Current Contests</h1>
<div class="row">
    {% if current_contest_list %}
        {% for contest in current_contest_list %}
            <div class="col-sm-4"><h1><a href="{% url 'contests:detail' contest.id%}">{{ contest.contest_name }}</a></h1>
                <img src="media/{{contest.display_image}}" class="img-responsive" alt="image">
                {{ contest.contest_name }}

                {% for submission in submission_list %}

                    {% if submission.contest == contest.contest_name %}
                        <P>Hi!</P>
                    {% endif %}
                    <p>{{ submission.contest }} {{ contest.contest_name }}</p>
                    {% if submission.contest == contest.contest_name %}
                        <P>Hi!</P>
                        {{ forloop.counter }}
                        {% set total_submissions = forloop.counter %}
                    {% endif %}


                {% endfor %}

    <p>Total entries: {{total_submissions}} </p>
当前竞赛
{%if当前的\u竞赛\u列表%}
{当前比赛列表%中的比赛的百分比}
{{contest.contest_name}
{提交中提交的百分比\列表%}
{%if submission.contest==contest.contest_name%}

{%endif%} {{submission.contest}{{contest.contest_name}}

{%if submission.contest==contest.contest_name%}

{{forloop.counter}} {%set total_submissions=forloop.counter%} {%endif%} {%endfor%} 总条目:{{Total_submissions}}


当我这样做时,total_submissions变量没有增加。我缺少什么?

据我所知,添加新提交内容时,您希望增加竞赛的提交数量。要做到这一点,你需要

  • 将新的
    提交
    插入数据库时,增加
    提交次数
  • 删除
    提交时,减少
    提交次数
  • 要执行(1),您可以覆盖
    Submission
    save()
    方法:

     def save(self, *args, **kwargs):
            if self.id is None: # To make sure this is an INSERT, not an UPDATE
                    contest = Contest.objects.select_for_update().get(id=self.contest.id)
                    contest.submission_count += 1
                    contest.save()
                    super().save(*args, **kwargs)  # Call the "real" save() method.
    
    要执行(2),您可以覆盖
    delete()
    方法:

    def delete(self):
            contest = Contest.objects.select_for_update().get(id=self.contest.id)
            contest.submission_count -= 1
            contest.save()
            super().delete()
    
    请注意,如果批量创建或删除提交,则此解决方案不起作用。更多信息请访问


    个人意见:我不会将提交数量存储在db中,除非用于计算提交数量的查询对性能有明显影响。

    Django确实不鼓励在模板内更改数据,而且这会使更改变得非常困难。您尝试执行的操作在模板中不起作用

    在模板代码中,
    提交列表
    来自哪里?如果您想在
    竞赛列表
    中迭代每个竞赛中的所有提交内容,您需要执行以下操作:

     {% for submission in contest.submission_set.all %}
    
    要获取计数,如果您的列表实际上是一个查询集(通常是)。。然后,获取模板内计数的最简单方法是在查询集上使用
    count
    ,例如:

    {{ contest.submission_set.all.count }}
    

    这将导致另一个数据库查询,但如果您不担心访问量过大,这应该没有问题。

    我不确定您是否可以更改模板变量的值,如
    {%set total_submissions=forloop.counter%}
    如果他想在数据库中保持计数,那么是的,就是这样,但是如果没有独占锁,如果两个人同时提交,这将导致一个竞赛条件。这是有道理的。谢谢@little_Birdiet谢谢你,我想这会有用的!我试图避免将计数存储在数据库中,但在运行查询时,我被难倒了。有无限的竞赛/提交,那么如何将适当的查询传递到模板中?自然的方法(对我来说,没有什么django经验)是将它们全部传递到模板中并执行上面的代码。但是这不起作用,所以我需要弄清楚如何在视图中为查询执行某种for循环,然后将提交计数列表传递到模板中@dvnguyensubmission_列表来自视图中的查询,是所有提交内容。我想这会管用,但我还没有试过。谢谢但是,这是对任何竞赛的所有参赛作品的查询集,还是仅对某一特定竞赛的参赛作品的查询集?我问这个问题的原因是,在你的模板代码中,看起来你正在循环当前所有的比赛。。然后,对于每个竞赛,您都会循环浏览提交列表。然后,您进入下一个竞赛,再次循环浏览提交列表。这将导致相同的提交被反复输出。我想你只想从一场比赛中获得参赛作品,在那场比赛之下,是不是?对,这是一个所有参赛作品的查询集。上面的大多数模板代码都是为了我的测试,以找出它为什么不能用于计数。我对如何运行查询感到困惑,因为您无法查询模板中的数据。我相信查询应该是:total\u count=submissions.filter(contest=contest.contest\u name).count,但我不确定它是否会正确引用contest.contest\u名称。另外,我是否只是在视图中做一个for循环,以便对每次竞赛进行计数?我想在主页上概述一下。“我真的很感谢你的帮助,”小小鸟说,“我成功了!”!!但是,它涉及到视图中的for循环,然后创建一个自定义模板标记,以通过模板中的键访问字典值。有没有更好的方法来实现这一点??完全不需要自定义模板标记。您只需计算视图函数中所需的任何值,然后将键添加到包含这些值的上下文中。。然后访问模板中的内容