Django按照文章ID更新文章

作者 : admin 本文共2785个字,预计阅读时间需要7分钟 发布时间: 2024-06-6 共1人阅读

重点是‘文章ID’作为参数,如何在各个环节传递。

1、视图函数向article_list.html传递articles变量,该变量包含所有文章。

@login_required
def article_list(request):
    articles = ArticlePost.objects.filter(author=request.user)
    context = {'articles': articles, }
    return render(request, 'article/column/article_list.html', context)

2、article_list.html文件中遍历articles,获得某个article的ID,并使用以下语句为‘编辑图标’设置超链接。注意这个url中包含参数。

href="{% url 'article:redit_article' article.id %}">
{% for article in articles %}
    <tr id={{ article.id }}>
        {{ forloop.counter }}
        { article.get_absolute_url }}">{{ article.title }}
        {{ article.column }}
        
            
                
            
            { article.id }})">
                
            
        
    
{% endfor %}

3、包含参数的url的写法如下。注意这里的article_id必须就是视图函数redit_article中使用的形参,如果不一致,会报错。

path('redit-article//', 
      views.redit_article, name='redit_article'),

4、视图函数redit_article的实现如下:

如果是Get请求,就使用获得的ID得到article的信息,传递到redit_article.html页面中,渲染该页面。

如果是POST请求,就使用获得的ID,跟新数据库中的对应条目。

@login_required
@csrf_exempt
def redit_article(request, article_id):
    if request.method == 'POST':
        try:
            data = json.loads(request.body)
            article_title = data.get('article_title')
            article_column_id = data.get('article_column_id')
            article_body = data.get('article_body')

            # 获取对应的栏目对象
            try:
                article_column = ArticleColumn.objects.get(id=article_column_id)
            except ArticleColumn.DoesNotExist:
                return HttpResponse("Invalid column ID", status=400)

            # 更新文章
            change_article = ArticlePost.objects.get(id=article_id)
            change_article.title = article_title
            change_article.column = article_column
            change_article.body = article_body
            change_article.save()

            return JsonResponse({'status': 'success'})
        except Exception as e:
            return JsonResponse({'status': 'error', 'message': str(e)}, status=500)
    elif request.method == 'GET':
        article_columns = request.user.article_column.all()
        article = ArticlePost.objects.get(id=article_id)
        this_article_form = ArticlePostForm(initial={'title':article.title, 'body':article.body})
        this_article_column = article.column
        context = {'article_id':article_id,
                   'article_columns':article_columns,
                   'this_article_form':this_article_form,
                   'this_article_column':this_article_column}
        return render(request, 'article/column/redit_article.html',
                      context)

5、redit_article.html文件实现如下:

{% extends "article/base.html" %}
{% load static %}
{% block title %}article post{% endblock %}
{% block content %}


    
        {% csrf_token %}
        
            标题:
            
                <input type="text" id="id_title" name="title" value="{{ this_article_form.title.value }}">
            
        
        
            栏目:
            
                
                    {% for column in article_columns %}
                        {% if column == this_article_column %}
                            <option value="{{ column.id }}" selected="selected">
                                {{ column.column }}
                            
                        {% else %}
                            <option value="{{ column.id }}">
                                {{ column.column }}
                            
                        {% endif %}
                    {% endfor %}
                
            
        
        
            内容:
            
                
            
        
        
            
        
    




{% endblock %}

在提交时,JavaScript函数中,使用var id = {{ article_id }}语句得到文章ID。AJAX提交时,url的写法如下‘/article/redit-article/${id}/’

fetch(`/article/redit-article/${id}/`, {
            method: 'POST',
            headers: {
                'Content-Type': 'application/json',
                'X-CSRFToken': getCookie('csrftoken')  // Django 的 CSRF token
            },
            body: JSON.stringify({
                            article_title: title,
                            article_column_id: column_id,
                            article_body:body,
                            }) //发送到后台的是一个字典
        })

本站无任何商业行为
个人在线分享 » Django按照文章ID更新文章
E-->