Приложение позволяет создавать и редактировать дерево категорий. Объект один - категория, с двумя параметрами: название и ссылка на родителя. Всего две страницы: первая отображает дерево целиком, где каждая категория - ссылка на вторую, индивидуальную, страницу категории. На индивидуальной странице отображается путь от корня дерева до этой категории и дается возможность изменить имя или удалть категорию.
Вот представления. В category_detail вызывается форма редактирования категории с одним полем name, и берется категория и ее предки (чтобы построить путь от корня дерева до категории):
class CategoryDelete(DeleteView):
model = Category
success_url = reverse_lazy('categories:index')
class CategoryUpdate(UpdateView):
model = Category
fields = ['name']
template_name_suffix = '_update_form'
def category_detail(request, pk):
category = get_object_or_404(Category, pk=pk)
form = UpdateCategoryForm(initial={'name': category.name})
return render(request, template_name='categories/detail.html',
context={
'category': category,
'ancestors': category.get_ancestors(),
'form': form,
})
HTML шаблон. В верхней части создается путь от корня до категории. Ниже две формы, первая вызывает представление CategoryUpdate, вторая представление CategoryDelete:
<div>
{% for ancestor in ancestors %}
<a href="{% url 'categories:detail' ancestor.id %}">
{{ ancestor.name }}
</a>
>
{% endfor %}
{{ category.name }}
</div>
<br/>
<br/>
<form action="{% url 'categories:update' category.id %}" method="post">
{% csrf_token %}
{{ form.as_p }}
<input type="submit" value="Сохранить" />
</form>
<form action="{% url 'categories:delete' category.id %}" method="post">
{% csrf_token %}
<input type="submit" value="Удалить" />
</form>
Вот форма:
class UpdateCategoryForm(forms.Form):
name = forms.CharField(label='Имя категории', max_length=50)
И urls
app_name = 'categories'
urlpatterns = [
url(r'^$', views.show_index, name='index'),
url(r'^(?P<pk>[\d]+)/$', views.category_detail, name='detail'),
url(r'^(?P<pk>[\d]+)/update$', views.CategoryUpdate.as_view(), name='update'),
url(r'^(?P<pk>[\d]+)/delete$', views.CategoryDelete.as_view(), name='delete'),
]
Получается, что при первом отображении страницы используется форма UpdateCategoryForm, созданная вручную, а при отправке формы та обрабатывается в представлении UpdateView, которое само умеет создавать себе форму.
Кажется, нужно выбрать что-то одно: или пользоваться своей формой, или той, которую дает Джанго? Как правильно?
Я пытался обойтись только UpdateView и передавать шаблону дополнительный контекст через get_context_data(), но у меня не получилось передать представлению перменную с id объекта.