ToB企服应用市场:ToB评测及商务社交产业平台

标题: Django按照文章ID更新文章 [打印本页]

作者: 丝    时间: 2024-6-11 08:47
标题: Django按照文章ID更新文章
重点是‘文章ID’作为参数,如何在各个环节传递。
1、视图函数向article_list.html传递articles变量,该变量包含全部文章。
  1. @login_required
  2. def article_list(request):
  3.     articles = ArticlePost.objects.filter(author=request.user)
  4.     context = {'articles': articles, }
  5.     return render(request, 'article/column/article_list.html', context)
复制代码
2、article_list.html文件中遍历articles,获得某个article的ID,并使用以下语句为‘编辑图标’设置超链接。注意这个url中包含参数。
  1. href="{% url 'article:redit_article' article.id %}">
复制代码
  1. {% for article in articles %}    <tr id={{ article.id }}>        <td>{{ forloop.counter }}</td>        <td><a href="{{ article.get_absolute_url }}">{{ article.title }}</a></td>        <td>{{ article.column }}</td>        <td>            <a name="edit" href="{% url 'article:redit_article' article.id %}">                <span class="fas fa-pencil-alt"></span>            </a>            <a name="delete" href="javascript:" onclick="del_article(this, {{ article.id }})">                <span class="fas fa-trash-alt" style="margin-left: 20px;"></span>            </a>        </td>    </tr>{% endfor %}
复制代码
3、包含参数的url的写法如下。注意这里的article_id必须就是视图函数redit_article中使用的形参,如果不划一,会报错。
  1. path('redit-article/<int:article_id>/',
  2.       views.redit_article, name='redit_article'),
复制代码
4、视图函数redit_article的实现如下:
如果是Get哀求,就使用获得的ID得到article的信息,传递到redit_article.html页面中,渲染该页面。
如果是POST哀求,就使用获得的ID,跟新数据库中的对应条目。
  1. @login_required
  2. @csrf_exempt
  3. def redit_article(request, article_id):
  4.     if request.method == 'POST':
  5.         try:
  6.             data = json.loads(request.body)
  7.             article_title = data.get('article_title')
  8.             article_column_id = data.get('article_column_id')
  9.             article_body = data.get('article_body')
  10.             # 获取对应的栏目对象
  11.             try:
  12.                 article_column = ArticleColumn.objects.get(id=article_column_id)
  13.             except ArticleColumn.DoesNotExist:
  14.                 return HttpResponse("Invalid column ID", status=400)
  15.             # 更新文章
  16.             change_article = ArticlePost.objects.get(id=article_id)
  17.             change_article.title = article_title
  18.             change_article.column = article_column
  19.             change_article.body = article_body
  20.             change_article.save()
  21.             return JsonResponse({'status': 'success'})
  22.         except Exception as e:
  23.             return JsonResponse({'status': 'error', 'message': str(e)}, status=500)
  24.     elif request.method == 'GET':
  25.         article_columns = request.user.article_column.all()
  26.         article = ArticlePost.objects.get(id=article_id)
  27.         this_article_form = ArticlePostForm(initial={'title':article.title, 'body':article.body})
  28.         this_article_column = article.column
  29.         context = {'article_id':article_id,
  30.                    'article_columns':article_columns,
  31.                    'this_article_form':this_article_form,
  32.                    'this_article_column':this_article_column}
  33.         return render(request, 'article/column/redit_article.html',
  34.                       context)
复制代码
5、redit_article.html文件实现如下:
  1. {% extends "article/base.html" %}
  2. {% load static %}
  3. {% block title %}article post{% endblock %}
  4. {% block content %}
  5. <div style="margin-left:10px">
  6.     <form class="form-horizontal" action="." method="post">
  7.         {% csrf_token %}
  8.         <div class="row" style="margin-top: 10px;">
  9.             <div class="col-md-2 text-right"><span>标题:</span></div>
  10.             <div class="col-md-10 text-left">
  11.                 <input type="text" id="id_title" name="title" value="{{ this_article_form.title.value }}">
  12.             </div>
  13.         </div>
  14.         <div class="row" style="margin-top: 10px;">
  15.             <div class="col-md-2 text-right"><span>栏目:</span></div>
  16.             <div class="col-md-10 text-left">
  17.                 <select id="which_column">
  18.                     {% for column in article_columns %}
  19.                         {% if column == this_article_column %}
  20.                             <option value="{{ column.id }}" selected="selected">
  21.                                 {{ column.column }}
  22.                             </option>
  23.                         {% else %}
  24.                             <option value="{{ column.id }}">
  25.                                 {{ column.column }}
  26.                             </option>
  27.                         {% endif %}
  28.                     {% endfor %}
  29.                 </select>
  30.             </div>
  31.         </div>
  32.         <div class="row" style="margin-top: 10px;">
  33.             <div class="col-md-2 text-right"><span>内容:</span></div>
  34.             <div class="col-md-10 text-left">
  35.                 <textarea id="id_body" name="body">{{ this_article_form.body.value }}</textarea>
  36.             </div>
  37.         </div>
  38.         <div class="row">
  39.             <input type="button" class="btn btn-primary btn-lg" value="更新">
  40.         </div>
  41.     </form>
  42. </div>
  43. <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
  44. <script>
  45.     $(document).ready(function() {
  46.         $("input[type=button]").click(function() {
  47.             redit_article();
  48.         });
  49.     });
  50.     function redit_article() {
  51.         var title = $("#id_title").val();
  52.         var column_id = $("#which_column").val();
  53.         var body = $("#id_body").val();
  54.         var id = {{ article_id }}
  55.         // 发送 AJAX 请求更新数据库,在fetch后支出了提交的url,由该url确定由那个view函数处理提交
  56.         fetch(`/article/redit-article/${id}/`, {
  57.             method: 'POST',
  58.             headers: {
  59.                 'Content-Type': 'application/json',
  60.                 'X-CSRFToken': getCookie('csrftoken')  // Django 的 CSRF token
  61.             },
  62.             body: JSON.stringify({
  63.                             article_title: title,
  64.                             article_column_id: column_id,
  65.                             article_body:body,
  66.                             }) //发送到后台的是一个字典
  67.         }).then(response => {
  68.             if (response.ok) {
  69.                 // 提交成功
  70.                 alert('文章更新成功');
  71.                 // 跳转到 article_list 页面
  72.                 window.location.href = "{% url 'article:article_list' %}";
  73.             } else {
  74.                 // 提交失败,处理错误
  75.                 alert('更新失败,请重试');
  76.             }
  77.         }).catch(error => {
  78.             console.error('Error:', error);
  79.             alert('更新失败,请重试');
  80.         });
  81.     }
  82.     // 获取 CSRF token 的函数(Django)
  83.     function getCookie(name) {
  84.         let cookieValue = null;
  85.         if (document.cookie && document.cookie !== '') {
  86.             const cookies = document.cookie.split(';');
  87.             for (let i = 0; i < cookies.length; i++) {
  88.                 const cookie = cookies[i].trim();
  89.                 if (cookie.substring(0, name.length + 1) === (name + '=')) {
  90.                     cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
  91.                     break;
  92.                 }
  93.             }
  94.         }
  95.         return cookieValue;
  96.     }
  97. </script>
  98. {% endblock %}
复制代码
在提交时,JavaScript函数中,使用var id = {{ article_id }}语句得到文章ID。AJAX提交时,url的写法如下‘/article/redit-article/${id}/’
  1. fetch(`/article/redit-article/${id}/`, {
  2.             method: 'POST',
  3.             headers: {
  4.                 'Content-Type': 'application/json',
  5.                 'X-CSRFToken': getCookie('csrftoken')  // Django 的 CSRF token
  6.             },
  7.             body: JSON.stringify({
  8.                             article_title: title,
  9.                             article_column_id: column_id,
  10.                             article_body:body,
  11.                             }) //发送到后台的是一个字典
  12.         })
复制代码


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4