Попытка скрыть кнопку, если следующий шаг не существует - PullRequest
0 голосов
/ 12 декабря 2018

Я пытаюсь заставить кнопку «следующий» исчезнуть, если нет следующего шага.Я попробовал следующее и застрял здесь.У меня есть задачи со связанными шагами, использующими ForeignKey.

Я думаю, что мой метод не работает, потому что PK не всегда начинается с 1. Пример задачи один имеет шаги pk 1,2,3.У второй задачи есть шаги pk 4,5,6.

Можно ли сделать так, чтобы ПК всегда был 1,2,3 для каждой задачи?Тогда это может сработать?Или есть лучшее решение?

views.py

def step_detail(request, task_pk, step_pk):
    step = get_object_or_404(Step, task_id=task_pk, pk=step_pk)
    next_step_pk = step_pk + 1
    next_step = Step.objects.filter(pk=next_step_pk)
    if next_step.count() == 0:
        next_step_pk = None

    return render(request, 'dailytask/step_detail.html', {'step': step,
                                                          'next_step_pk': next_step_pk})

models.py:

class Task(models.Model):
    created_at = models.DateTimeField(auto_now_add=True)
    user_completed = models.BooleanField(default=False)
    title = models.CharField(max_length=255)
    description = models.TextField(blank=True, default="")
    category = models.CharField(max_length=255, choices=CATEGORIES, default="traffic")
    done_message = models.TextField(null=True, default="")

    def __str__(self):
        return self.title


class Step(models.Model):
    title = models.CharField(max_length=255)
    description = models.TextField(blank=True, default="")
    user_completed = models.BooleanField(default=False)
    content = models.TextField(blank=True, default="")
    order = models.IntegerField(default=0)
    step_number = models.IntegerField(default=1)
    task = models.ForeignKey(Task, on_delete=models.CASCADE)

    class Meta:
        ordering = ['order', ]

    def __str__(self):
        return self.title

step_detail.html

Я хочу этокнопка, чтобы скрыть, когда в задаче больше нет шагов.

{% if next_step_pk %}
    <a href="{% url 'step' task_pk=step.task.pk step_pk=next_step_pk %}">
        <button class="btn btn-primary btn-block" type="button" style="background-color:rgba(0,123,255,0);margin-bottom:0px;">Next Step</button>
    </a>
{% endif %}

urls.py:

path('<int:task_pk>/<int:step_pk>/', views.step_detail, name='step'),

1 Ответ

0 голосов
/ 12 декабря 2018

Индексирование PK для поиска следующего шага не будет работать.PK не связан с задачей.
Представьте, что у вас есть две задачи с 3 шагами, затем вы добавляете новый шаг к первой задаче.Это означало бы, что у первой задачи будет 4 шага с pks 1,2,3 и 7.

У вас есть связь между задачей и шагом.Установите связанное имя в foreignkeyField.
task = models.ForeignKey(Task, on_delete=models.CASCADE, related_name="steps")
https://docs.djangoproject.com/en/2.1/ref/models/fields/

Затем при поиске вы можете сделать следующее:

next_steps = step.task.steps.filter(order__gt=step.order)
Этовыполнит поиск в базе данных всех шагов для этой задачи, у которых номер заказа больше, чем step.order.Возможно, у меня неправильный синтаксис, но я думаю, что я понял его правильно, если он не работает, прочитайте немного здесь:
https://docs.djangoproject.com/en/2.1/topics/db/queries/

Тогда вы можете позвонить next_steps.count() и next_steps[0] дляполучить следующий шаг.Теперь, когда у вас есть рабочий метод для перехода к следующему шагу, вы сможете найти способ переключения кнопки.

...