【问题标题】:Django |add: on PK URL tagDjango |add: 在 PK URL 标签上
【发布时间】:2019-03-22 15:10:01
【问题描述】:

我正在尝试在 HTML 模板中使用 |add:"1" 获取下一个 PK 值。 我的问题是如何让它工作?例如,如果 PK 为 1,则单击链接后应为 2。见代码。

模板

 <h3>
    <a href="{% url 'step' task_pk=step.task.pk step_pk=step_id|add:"1" %}">Next Step</a>
</h3>

型号

class Task(models.Model):
CATEGORIES = (
    ('tr', 'Traffic'),
    ('cr', 'Conversion Rate'),
    ('br', 'Bounce Rate'),
    ('ma', 'Marketing'),
    ('sc', 'Sales Channels'),
    ('cur', 'Customer Relations'),
)
title = models.CharField(max_length=100)
description = models.CharField(max_length=300)
category = models.CharField(max_length=100, choices=CATEGORIES)
created_at = models.DateTimeField(auto_now_add=True)
order = models.IntegerField(default=0)
id = models.AutoField(primary_key=True)

def __str__(self):
    return self.title


class Step(models.Model):
task = models.ForeignKey(Task, on_delete=models.CASCADE)
order = models.PositiveIntegerField(default=1)
title = models.CharField(max_length=100)
is_complete = models.BooleanField(default=False)
description = models.TextField()
id = models.AutoField(primary_key=True)

class Meta:
    ordering = ['order']
    unique_together = ("task", "order")

def __str__(self):
    return self.title

观看次数

def task_step(request, task_pk, step_pk):
step = get_object_or_404(Step, task_id=task_pk, pk=step_pk)
return render(request, 'totd/task_step.html', {'step': step})

网址

urlpatterns = [
re_path(r'(?P<task_pk>\d+)/(?P<step_pk>\d+)/$', views.task_step, name='step'),
]

【问题讨论】:

    标签: django python-3.x django-models django-templates django-views


    【解决方案1】:

    将 next_step id 作为上下文的一部分提交可能更容易。这样您可以先检查该值是否存在于数据库中,并且在呈现模板时不会出现 ReverseMatch 错误。

    def task_step(request, task_pk, step_pk):
        step = get_object_or_404(Step, task_id=task_pk, pk=step_pk)
        next_step_pk = step_pk + 1
    
        # Use a filter operation so if there is no item with this pk it won't fail but will return an empty queryset
        next_step = Step.objects.filter(pk=next_step_pk)
        # Check the next step pk has a DB entry and set it to None if it doesn't exist
        if next_step.count() == 0:
            next_step_pk = None
        return render(request, 'totd/task_step.html', {'step': step,
                                                       'next_step_pk': next_step_pk})
    

    然后,您将可以在模板中访问此上下文,并且只有在链接存在时才能呈现链接。

    {% if next_step_pk %}
         <h3>
            <a href="{% url 'step' task_pk=step.task.pk step_pk=next_step_pk %}">Next Step</a>
        </h3>
    {% endif %}
    

    【讨论】:

      猜你喜欢
      • 2012-11-07
      • 2012-11-08
      • 1970-01-01
      • 2019-08-26
      • 1970-01-01
      • 2012-07-01
      • 2016-05-19
      • 2013-07-07
      相关资源
      最近更新 更多