Большая часть вопроса не связана с siteflags .
См. « Написание дополнительных представлений », чтобы получить пример urls.py . Например, это может выглядеть как
path('videos//', views.user_bookmarked_video, name='videos_bookmarked'),
Однако ваш bookmark_id вводит в заблуждение, поскольку это идентификатор видео, а не идентификатор закладки. Более того, ваш вид называется user_bookmarked_video () , но это не то, что он делает - он просто устанавливает флаг (закладку) для некоторого видеообъекта.
Если вы планируете использовать это представление просто для установки закладки, лучше назвать ее как set_video_bookmark () и перенаправить в конце функции вместо рендеринга html.
Если вы намеревались показать все видео с закладками для текущего пользователя, то нет необходимости принимать аргумент bookmark_id для вашего просмотра и отмечать его при каждом вызове представления.
Ваш html может выглядеть так, как вы хотите, в зависимости от того, что вы хотите увидеть. Например:
{{ video.name }}
Мне лично не нравится первый пример, потому что Вы добавляете Узел, который еще не "готов" (поскольку конструктор не закончил выполняться). В большинстве случаев это будет хорошо работать, но в крайних случаях у Вас могут быть ошибки, которые довольно трудно найти.
Я думаю, что обе реализации в порядке.
Вопрос состоит больше в том, как Вы будете использовать этот класс: Вы создадите список узлов сначала и затем начнете добавлять их отношения, или Вы сделаете это организованным способом, как в Вашем примере?
Второе решение предлагает больше гибкости, также если Вы когда-нибудь хотите использовать Node1 в качестве суперкласса, Вы не связываетесь с подписью конструктора.
Я использовал бы второй случай как затем, я смогу добавить детей позже, но не только в конструкторе.
Мне не нравится первый случай - родительский объект волшебно изменяется только, будучи переданным в - необходимо прочитать код или документы, чтобы понять, что это происходит. Просто передача в родителе только подразумевает, что ребенок знает родителя - не, что ребенок добавляется к внутреннему списку родителя также.
Второй пример лучше. Вы могли также возвратить ребенка из 'добавить' операции для разрешения операции, объединяющей в цепочку как:
Node2 child = parent.add(new Node2());
Я не вижу оснований, почему не объединить два подхода для удобства:
class Node1 {
public Node1(String name, Node1 parent = null) {
this.name = name;
// etc., do initialization
if(parent != null)
parent.add(this);
}
private void add(Node1 child) {
child.setParent(this);
children.add(child);
}
}
Обратите внимание, что setParent () должен или выдать исключение, когда у ребенка уже есть его родительский набор, или правильно удалите себя из дочернего списка бывшего родителя.
При получении Узла из класса TreeNode затем, Вы автоматически получаете 2-ю вашу реализацию. Можно добавить "пользовательский" treenode к регулярному классу Treeview.
Во-первых плохое в Вашем первом образце: если (родитель! = пустой указатель) {эта проверка необходима, потому что у Вас должен быть шанс создать корень дерева, но параметр с двумя состояниями выглядит ужасным.
Также сначала Ваш образец, не хороший, потому что, делая неявные действия (добавляющий ребенка к переданному родителю).
Я предпочел бы реализацию № 1 только, когда абсолютно необходимо иметь родительский узел с дочерним узлом. В этом случае для клиентского кода довольно возможно опустить вызов к Node1.add (ребенок Node1) ведущий к ошибкам позже.
Я предпочел бы реализацию № 2 иначе, потому что это более ясно иметь использование как
Node1 parent = new Node1();
Node1 child = new Node1();
parent.add(child);