Django | добавить: на ПК тег URL - PullRequest
0 голосов
/ 17 октября 2018

Я пытаюсь получить следующее значение PK, используя | add: «1» в шаблоне HTML.Мой вопрос: как мне заставить его работать?Пример, если 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})

URL

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

1 Ответ

0 голосов
/ 18 октября 2018

Может быть проще передать идентификатор next_step как часть контекста.Таким образом, вы можете проверить, что значение сначала существует в БД, и вы не получите ошибку 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 %}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...