Книга «Изучаем Python»



Pdf көрінісі
бет228/238
Дата07.01.2022
өлшемі7,86 Mb.
#18670
түріКнига
1   ...   224   225   226   227   228   229   230   231   ...   238
Байланысты:
2 5343781172763690906

Рис. 19.2. Страница new_entry

Добавление записей

А теперь мы создадим страницу, на которой пользователи смогут редактировать 

ранее добавленные записи.

URL-адрес для edit_entry

В URL-адресе страницы должен передаваться идентификатор редактируемой 

 записи. В файл 

learning_logs/urls .py

 для этого вносятся следующие изменения:

urls.py

...


urlpatterns = [

...


    # Страница для редактирования записи

    url(r'^edit_entry/(?P\d+)/$', views.edit_entry,

        name='edit_entry'),

]



Редактирование данных    417

Идентификатор, переданный в URL (например, http://localhost:8000/edit_entry/1/), 

сохраняется в параметре 

entry_id


. Схема The URL отправляет запросы, соответ-

ствующие этому формату, функции представления 

edit_entry()

.

Функция представления edit_entry()



Когда страница 

edit_entry

 получает запрос GET, 

edit_entry()

 возвращает форму 

для редактирования записи. При получении запроса POST с отредактированной 

записью страница сохраняет измененный текст в базе данных:

views.py

from django.shortcuts import render

...

from .models import Topic, Entry



from .forms import TopicForm, EntryForm

...


def edit_entry(request, entry_id):

    """Редактирует существующую запись."""

    entry = Entry.objects.get(id=entry_id)



    topic = entry.topic

    


    if request.method != 'POST':

        # Исходный запрос; форма заполняется данными текущей записи.

        form = EntryForm(instance=entry)



    else:

        # Отправка данных POST; обработать данные.

        form = EntryForm(instance=entry, data=request.POST)



        if form.is_valid():

            form.save()



            return HttpResponseRedirect(reverse('learning_logs:topic',

                                        args=[topic.id]))

    


    context = {'entry': entry, 'topic': topic, 'form': form}

    return render(request, 'learning_logs/edit_entry.html', context)

Сначала необходимо импортировать модель 

Entry


. В точке  мы получаем объект 

записи, который пользователь хочет изменить, и тему, связанную с этой записью. 

В блоке 

if

, который выполняется для запроса GET, создается экземпляр 



EntryForm

 

с аргументом 



instance=entry

 . Этот аргумент приказывает Django создать форму, 

заранее заполненную информацией из существующего объекта записи. Пользова-

тель видит свои существующие данные и может отредактировать их.

При  обработке  запроса  POST  передаются  аргументы 

i n s t a n c e = e n t r y

 

и 

data=request.POST



 , чтобы приказать Django создать экземпляр формы на 

основании информации существующего объекта записи, обновленный данными 

из 

request.POST



. Затем проверяется корректность данных формы. Если данные 

корректны, следует вызов 

save()

 без аргументов . Далее происходит перена-



правление на страницу темы , и пользователь видит обновленную версию от-

редактированной им записи.




418    Глава 19  •  Учетные записи пользователей

Шаблон edit_entry

Шаблон 

edit_entry .html

 очень похож на 

new_entry .html

:

edit_entry.html

{% extends "learning_logs/base.html" %}

{% block content %}

 
{{ topic }}


    


 
Edit entry:

    


 

    {% csrf_token %}

    {{ form.as_p }}

   



 

{% endblock content %}

В точке  аргумент 

action


 отправляет форму функции 

edit_entry()

 для обработ-

ки. Идентификатор записи включается как аргумент в тег 

{%

 

url



 

%}

 , чтобы функ-



ция представления могла изменить правильный объект записи. Кнопка отправки 

данных создается с текстом, который напоминает пользователю, что он сохраняет 

изменения, а не создает новую запись .

Создание ссылки на страницу edit_entry

Теперь необходимо включить ссылку на страницу 

edit_entry

 в каждую тему 

на странице со списком тем:



topic.html

...


{% for entry in entries %}


  • {{ entry.date_added|date:'M d, Y H:i' }}

    {{ entry.text|linebreaks }}

         

            edit entry

         



  • ...


    После даты и текста каждой записи включается ссылка редактирования. Мы ис-

    пользуем шаблонный тег 

    {%

     

    url



     

    %}

     для определения схемы URL из именованной 



    схемы 

    edit_entry

     и идентификатора текущей записи в цикле (

    entry.id


    ). Текст 

    ссылки 


    "edit

     

    entry"



     выводится после каждой записи на странице. На рис. 19.3 по-

    казано, как выглядит страница со списком тем с этими ссылками.

    Приложение Learning Log уже сейчас содержит бульшую часть необходимой 

    функциональности. Пользователи могут добавлять темы и записи, а также чи-

    тать любые записи по своему усмотрению. В этом разделе мы реализуем систему



    Создание учетных записей пользователей    419



    Достарыңызбен бөлісу:
    1   ...   224   225   226   227   228   229   230   231   ...   238




    ©emirsaba.org 2024
    әкімшілігінің қараңыз

        Басты бет