• 19.1.3 编辑条目


    19.1.3  编辑条目
    
    下面来创建一个页面,让用户能够编辑既有的条目:
    
    1.URL 模式edit_entry:
    
    这个页面的URL需要传递要编辑的条目的ID,修改后的lerning_logs/urls.py如下:
    
    urls.py
    
    node2:/django/mysite/learning_log/learning_logs#cat urls.py
    from django.conf.urls import url
    from . import views
    urlpatterns = [
       
       url(r'^$',views.index,name='index'),
       url(r'^topics/$',views.topics,name='topics'),
       url(r'^new_topic/$',views.new_topic,name='new_topic'),
       url(r'^topics/(?P<topic_id>d+)/$',views.topic,name='topic'),
       url(r'^new_entry/(?P<topic_id>d+)/$',views.new_entry,name='new_entry'),
       url(r'edit_entry/(?P<entry_id>d+)$',views.edit_entry,name='edit_entry'),
    
    ]
    
    
    在URL(如http://localhost:8000/edit_entry/1/)中传递的ID存储在形参entry_id中,
    
    这个URL模式将预期匹配的请求发送给视图函数edit_entry()
    
    
    2.视图函数edit_entry()
    
    页面edit_entry收到GET请求时,edit_entry()将返回一个表单,
    
    让用户能够对条目进行编辑。该页面收到POST请求(条目文本经过修订)时,
    
    它将修改后的文本保存到数据库中
    
    from django.shortcuts import render
    --snip--
    from .models import Topic, Entry
    from .forms import TopicForm, EntryForm
    --snip--
    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. 在1处,我们获取用户要修改的条目对象,
    
    以及与该条目相关联的主题。 在请求方法为GET时将执行的if代码块中,
    
    我们使用实参instance=entry创建一个EntryForm实例。
    
    这个实参让Django创建一个表单,并使用既有条目对象中的信息填充它。
    
    用户将看到既有数据,并能编辑它们
    
    
    处理POST请求时,我们传递实参instance=entry和data=request.POST,让Django根据既有条目
    
    对象创建一个表单实例,并根据request.POST中的相关数据对其进行修改。
    
    3.模板edit_entry.html
    
    edit_entry.html
    
    {% extends "learning_logs/base.html" %}
    {% block content %}
    <p><a href="{% url 'learning_logs:topic' topic.id %}">{{ topic }}</a></p>
    <p>Edit entry:</p>
    <form action="{% url 'learning_logs:edit_entry' entry.id %}" method='post'>
    {% csrf_token %}
    {{ form.as_p }}
    <button name="submit">save changes</button>
    </form>
    {% endblock content %}
    
    
    
    node2:/django/mysite/learning_log/learning_logs/templates/learning_logs#cat topic.html
    {% for entry in entries %}
    <li>
    <p>{{ entry.date_added|date:'M d, Y H:i' }}</p>
    <p>{{ entry.text|linebreaks }}</p>
    <p>
    <a href="{% url 'learning_logs:edit_entry' entry.id %}">edit entry</a>
    </p>
    </li>
    {% endfor %}
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
  • 相关阅读:
    PAT (Basic Level) Practice (中文)1022 D进制的A+B
    PAT (Basic Level) Practice (中文)1001 害死人不偿命的(3n+1)猜想
    Pycharm的调试
    Pycharm自带Git实现版本管理
    JMeter分布式压测
    JMeter内存溢出:java.lang.OutOfMemoryError: Java heap space解决方法
    JMeter资源监控插件PerfMon的使用
    JMeter命令行执行+生成HTML报告
    JMeter压测“java.net.SocketException: Socket closed”解决方法
    JMeter压测“java.net.BindException: Address already in use: connect”解决方法
  • 原文地址:https://www.cnblogs.com/hzcya1995/p/13348702.html
Copyright © 2020-2023  润新知