首页 > 解决方案 > Django 博客 post_update 功能未按预期工作

问题描述

我正在关注一个 youtube 频道来创建一个博客。我被困在 post_update 功能上。当我尝试更新帖子时,评论正在更新,这在这种情况下不应该发生。我哪里错了?

def post_update(request, id):
        title = 'Update'
        post = get_object_or_404(Post, id=id)
        form = PostForm(
            request.POST or None,
            request.FILES or None,
            instance=post)
        author = get_author(request.user)
        if request.method == "POST":
            if form.is_valid():
                form.instance.author = author
                form.save()
                return redirect(reverse("post-detail", kwargs={
                    'id': form.instance.id
                }))
        context = {
            'title': title,
            'form': form
        }
        return render(request, "post_create.html", context)

视图.py

from django.db.models import Count, Q
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
from django.shortcuts import render, get_object_or_404, redirect, reverse
from .forms import CommentForm, PostForm
from .models import Post, Author
from marketing.models import Signup

def get_author(user):
    qs= Author.objects.filter(user=user)
    if qs.exists():
        return qs[0]
    return None

def search(request):
    queryset = Post.objects.all()
    query = request.GET.get('q')
    if query:
        queryset = queryset.filter(
            Q(title__icontains = query) |
            Q(overview__icontains = query)
        ).distinct()
    context = {
        'queryset' : queryset
    }
    return render(request, 'search_results.html', context)

def get_category_count():
    queryset = Post \
        .objects \
        .values('categories__title') \
        .annotate(Count('categories__title'))
    return queryset


def index(request):
    featured = Post.objects.filter(featured=True)
    latest = Post.objects.order_by('-timestamp')[:3]

    if request.method == "POST":
        email = request.POST['email']
        new_signup = Signup()
        new_signup.email = email
        new_signup.save()

    context = {
        'object_list' : featured ,
        'latest' :latest
    }
    return render(request, 'index.html', context)

def blog(request):
    category_count = get_category_count()
    #print(category_count)
    most_recent = Post.objects.order_by('-timestamp')[:3]
    post_list = Post.objects.all()
    paginator = Paginator(post_list, 4)
    page_request_var ='page'
    page = request.GET.get(page_request_var)
    try:
        paginated_queryset = paginator.page(page)
    except PageNotAnInteger:
        paginated_queryset = paginator.page(1)
    except EmptyPage:
        paginated_queryset = paginator.page(paginator.num_pages)
    
    context = {
        'queryset' : paginated_queryset,
        'most_recent' : most_recent,
        'page_request_var': page_request_var,
        'category_count': category_count
    }
    return render(request, 'blog.html', context)

def post(request, id):
    most_recent = Post.objects.order_by('-timestamp')[:3]
    category_count = get_category_count()
    post = get_object_or_404(Post, id=id)
    form = CommentForm(request.POST or None)
    if request.method == "POST":
        if form.is_valid():
            form.instance.user= request.user
            form.instance.post = post
            form.save()
            return redirect(reverse("post-detail", kwargs={
                'id' : post.id
            }))
    context ={
        'form' : form,
        'post' : post,
        'most_recent' : most_recent,
        'category_count': category_count
    }
    return render(request, 'post.html', context)

def post_create(request):
    title = 'Create'
    form = PostForm(request.POST or None, request.FILES or None)
    author = get_author(request.user)
    if request.method == "POST":
        if form.is_valid():
            form.instance.author= author
            form.save()
            return redirect(reverse("post-detail", kwargs={
                'id' : form.instance.id
            }))
    context = {
        'title': title,
        'form' : form
    }
    return render(request, "post_create.html", context)

def post_update(request, id):
    title = 'Update'
    post = get_object_or_404(Post, id=id)
    form = PostForm(
        request.POST or None,
        request.FILES or None,
        instance=post)
    author = get_author(request.user)
    if request.method == "POST":
        if form.is_valid():
            form.instance.author = author
            form.save()
            return redirect(reverse("post-detail", kwargs={
                'id': form.instance.id
            }))
    context = {
        'title': title,
        'form': form
    }
    return render(request, "post_create.html", context)

def post_delete(request, id):
    post = get_object_or_404(Post, id=id)
    post.delete()
    return redirect(reverse("post-list"))

内容中存在的任何内容都将更新为不应发生的评论,我无法理解流程。而且<P> 标签也是可见的,我没有在html中使用过。

在此处输入图像描述

post_create.html

{% extends 'base.html ' %}
{% load crispy_forms_tags %}

  {% block content %}

    <div class="col-4 offset-4 mb-5 mt-5">
        <h3>{{ title }} an Article</h3>
        {{ form.media }}
        <form method="POST" action="." enctype="multipart/form-data">
            {% csrf_token %}
            {{ form|crispy }}
            <button class="btn btn-primary" type="submit">Submit</button>
        </form>
    </div>

  {% endblock content %}

模型.py

from django.db import models
from django.contrib.auth import get_user_model
from django.urls import reverse
from tinymce import HTMLField

User =  get_user_model()

# class PostView(models.Model):
#     user = models.ForeignKey(User, on_delete=models.CASCADE)
#     post = models.ForeignKey('Post', on_delete=models.CASCADE)

#     def __str__(self):
#         return self.user.username


class Author(models.Model):
    user = models.OneToOneField(User, on_delete = models.CASCADE)
    profile_picture = models.ImageField()

    def __str__(self):
        return self.user.username

class Category(models.Model):
    title = models.CharField(max_length = 20)

    def __str__(self):
        return self.title


# Create your models here.
class Post(models.Model):
    title = models.CharField(max_length=100)
    overview = models.TextField()
    timestamp = models.DateTimeField(auto_now_add=True)
    content = HTMLField()
    comment_count = models.IntegerField(default =0)
    view_count = models.IntegerField(default =0)
    author = models.ForeignKey(Author, on_delete = models.CASCADE)
    thumbnail = models.ImageField()
    categories = models.ManyToManyField(Category)
    featured = models.BooleanField()
    previous_post = models.ForeignKey('self', related_name = 'previous', on_delete = models.SET_NULL, blank=True, null = True)
    next_post = models.ForeignKey('self', related_name = 'next', on_delete = models.SET_NULL, blank=True, null = True)
    

    def __str__(self):
        return self.title

    def get_absolute_url(self):
        return reverse('post-detail', kwargs={
            'id': self.id
        })
    
    def get_update_url(self):
        return reverse('post-update', kwargs={
            'id': self.id
        })
    def get_delete_url(self):
        return reverse('post-delete', kwargs={
            'id': self.id
        })

    @property
    def get_comments(self):
        return self.comments.all().order_by('-timestamp')


class Comment(models.Model):
    user = models.ForeignKey(User, on_delete = models.CASCADE)
    timestamp = models.DateTimeField(auto_now_add=True)
    content = models.TextField()
    #profile_picture = models.ImageField()
    post = models.ForeignKey(Post, related_name='comments', on_delete = models.CASCADE)

    def __str__(self):
        return self.user.username

post.html

{% extends 'base.html ' %}
 {% load static %}
  {% block content %}
    <style>
      .post-body img {
        width: 100%;
      }
    </style>
    <div class="container">
      <div class="row">
        <!-- Latest Posts -->
        <main class="post blog-post col-lg-8"> 
          <div class="container">
            <div class="post-single">
              <div class="post-thumbnail"><img src="{{ post.thumbnail.url }}" alt="..." class="img-fluid"></div>
              <div class="post-details">
                <div class="post-meta d-flex justify-content-between">
                  
                  <div class="category">
                    {% for cat in post.categories.all %}                    
                    <a href="#">{{ cat }}</a>
                    {% endfor %}
                  </div>
                  <div>
                    <a href="{% url 'post-update' id=post.id %}">Update</a>
                    <a href="{% url 'post-delete' id=post.id %}">Delete</a>
                  </div>
                </div>
                <h1>{{ post.title }}<a href="#"><i class="fa fa-bookmark-o"></i></a></h1>
                <div class="post-footer d-flex align-items-center flex-column flex-sm-row"><a href="#" class="author d-flex align-items-center flex-wrap">
                    <div class="avatar"><img src="{{ post.author.profile_picture.url }}" alt="..." class="img-fluid"></div>
                    <div class="title"><span>{{ post.author.user.username }}</span></div></a>
                  <div class="d-flex align-items-center flex-wrap">       
                    <div class="date"><i class="icon-clock"></i> {{ post.timestamp|timesince }} ago</div>
                    <div class="views"><i class="icon-eye"></i> {{ post.view_count }}</div>
                    <div class="comments meta-last"><i class="icon-comment"></i>{{ post.comment_count }}</div>
                  </div>
                </div>
                <div class="post-body">
                  {{ post.content|safe }}
                 </div>
                <div class="posts-nav d-flex justify-content-between align-items-stretch flex-column flex-md-row">
                  {% if post.previous_post %}
                  <a href="{{ post.previous_post.get_absolute_url }}" class="prev-post text-left d-flex align-items-center">
                    <div class="icon prev"><i class="fa fa-angle-left"></i></div>
                    
                    <div class="text"><strong class="text-primary">Previous Post </strong>
                      <h6>{{ post.previous.title }}</h6>
                    </div>
                  </a>
                  {% endif %}
                  {% if post.next_post %}
                  <a href="{{ post.next_post.get_absolute_url }}" class="next-post text-right d-flex align-items-center justify-content-end">
                    <div class="text"><strong class="text-primary">Next Post </strong>
                      <h6>{{ post.next.title }}</h6>
                    </div>
                    <div class="icon next"><i class="fa fa-angle-right">   </i></div>
                  </a>
                {% endif %}
                </div>
                <div class="post-comments">
                  <header>
                    <h3 class="h6">Post Comments<span class="no-of-comments">{{ post.comments.count }}</span></h3>
                  </header>
                  {% for comment in post.get_comments %}
                  <div class="comment">
                    <div class="comment-header d-flex justify-content-between">
                      <div class="user d-flex align-items-center">
                        <div class="image">
                          {% if comment.user.author %}
                          <img src="{{ comment.user.author.profile_picture.url }}" alt="NA" class="img-fluid rounded-circle">
                          {% else %}
                          <img src="{% static 'img/user.svg' %}" alt="..." class="img-fluid rounded-circle">
                          {% endif %}
                        </div>
                        <div class="title"><strong>{{ comment.user.username }}</strong><span class="date">{{ comment.timestamp|timesince }} ago</span></div>
                      </div>
                    </div>
                    <div class="comment-body">
                      <p>{{ comment.content }}</p>
                    </div>
                  </div>
                  {% endfor %}
                </div>
                {% if request_user.is_authenticated %}
                <div class="add-comment">
                  <header>
                    <h3 class="h6">Leave a reply</h3>
                  </header>
                  <form method ="POST" action="." class="commenting-form">
                    {% csrf_token %}
                    
                    <div class="row">                      
                      <div class="form-group col-md-12">
                        {{ form }}
                      </div>
                      <div class="form-group col-md-12">
                        <button type="submit" class="btn btn-secondary">Submit Comment</button>
                      </div>
                    </div>
                  </form>
                </div>
                {% endif %}
              </div>
            </div>
          </div>
        </main>
        {% include 'sidebar.html' with most_recent=most_recent  category_count=category_count %}
      </div>
    </div>
    {% endblock %}

标签: djangodjango-modelsdjango-formsdjango-views

解决方案


推荐阅读