Уведомления

Группа в Telegram: @pythonsu
  • Начало
  • » Django
  • » UpdateView и дополнительная информация об объекте [RSS Feed]

#1 Сен. 8, 2017 12:34:22

Trit
Зарегистрирован: 2017-06-18
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

UpdateView и дополнительная информация об объекте

Здравствуйте! У меня такая проблема. Нужно отобразить страницу с информацией об объекте, с возможностью редактирования одного из полей (имя объекта) и возможностью удаления объекта. Пытаюсь сделать все это через представления-классы, но не получается. Как легче и как правильно сделать такую страницу?

Офлайн

#2 Сен. 8, 2017 16:00:33

xzvf
Зарегистрирован: 2016-09-04
Сообщения: 12
Репутация: +  0  -
Профиль   Отправить e-mail  

UpdateView и дополнительная информация об объекте

А что именно не получается? man UpdateView, DeleteView. И какой-нибудь код приведите.

Офлайн

#3 Сен. 8, 2017 18:33:50

Trit
Зарегистрирован: 2017-06-18
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

UpdateView и дополнительная информация об объекте

Приложение позволяет создавать и редактировать дерево категорий. Объект один - категория, с двумя параметрами: название и ссылка на родителя. Всего две страницы: первая отображает дерево целиком, где каждая категория - ссылка на вторую, индивидуальную, страницу категории. На индивидуальной странице отображается путь от корня дерева до этой категории и дается возможность изменить имя или удалть категорию.

Вот представления. В 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>
        &gt;
    {% 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 объекта.


Отредактировано Trit (Сен. 9, 2017 11:14:22)

Офлайн

  • Начало
  • » Django
  • » UpdateView и дополнительная информация об объекте[RSS Feed]

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version