Django ModelForm 블로그 편집에 대한 변경 사항을 저장할 수 없습니다. 양식이 이전 상태로 되돌아갑니다.

아샤

이 주제와 관련된 다른 두 개의 게시물을 읽었지만 내 문제에 대한 해결책을 찾을 수 없었습니다. 편집 내용이 저장된 페이지를 표시하거나 렌더링합니다. "변경 사항 저장"버튼을 클릭하면 양식이 편집이 이루어지기 전의 이전 미리 채워진 인스턴스 상태로 되돌아갑니다.

이것은 Python Crash Course의 연습 19-1입니다.

19-1. 블로그 : Blog 라는 새 Django 프로젝트를 시작합니다. 프로젝트에서 blogs라는 앱과 BlogPost라는 모델을 만듭니다. 모델에는 title, text 및 date_added와 같은 필드가 있어야합니다. 프로젝트의 수퍼 유저를 만들고 관리 사이트를 사용하여 몇 가지 짧은 게시물을 작성합니다. 모든 게시물을 시간순으로 표시하는 홈페이지를 만듭니다. 새 게시물을 만들기위한 양식과 기존 게시물을 편집하기위한 다른 양식을 만듭니다. 양식을 작성하여 제대로 작동하는지 확인하십시오.

models.py :

from django.db import models

class Blog_post(models.Model):
    """A blogpost posted by a User"""

    title = models.CharField(max_length=200)
    body = models.TextField()
    date_added = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        """Return a string representation of the model."""
        return f"{self.title}\n{self.body}"

forms.py :

from django import forms
from .models import Blog_post

class NewPostForm(forms.ModelForm):
    class Meta:
        model = Blog_post
        fields = ['body', 'title']
        labels = {'body': '', 'title': "Title:"}

views.py

from django.shortcuts import render, redirect
from .models import Blog_post
from .forms import NewPostForm

def index(request):
    """The home page for Blog."""
    posts = Blog_post.objects.order_by('date_added')
    context = {'posts': posts}
    return render(request, 'blogs/index.html', context)

def new_post(request):
    """Add a new blogpost."""

    if request.method != 'POST':
        # No data submitted; create a blank form.
        form = NewPostForm()

    else:
        # POST data submitted; process data.
        form = NewPostForm(data=request.POST)
        if form.is_valid():
        form.save()
        return redirect('blogs:index')

    context = {'form': form}
    return render(request, 'blogs/new_post.html', context)

def edit_post(request, post_id):
    """Edit an existing post."""
    post = Blog_post.objects.get(id=post_id)

    if request != 'POST':
        form = NewPostForm(instance=post)

    else:
        form = NewPostForm(instance=post, data=request.POST)
        if form.is_valid():
            form.save()
            return redirect('blogs:index', post_id=post.id)

    context = {'post': post, 'form': form}
    return render(request, 'blogs/edit_post.html', context)

urls.py

from django.urls import path
from . import views

app_name = 'blogs'

urlpatterns = [
    # Home page
    path('', views.index, name='index'),

    # Page for adding a new blogpost
    path('new_post/', views.new_post, name='new_post'),

    # Page for editing an entry.
    path('edit_post/<int:post_id>/', views.edit_post, name='edit_post'),
]

index.html

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

{% block content %}

<p> This is the Blog project exercise 19-1 on pg 421 of Python Crash Course.</p>

<p> Blogposts: </p>
<ul>
  {% for post in posts %}
    <li>
      <p>{{ post.date_added|date:'M d, Y H:i' }} - {{ post }} -
        <a href="{% url 'blogs:edit_post' post.id %}">Edit Post</a>
      </p>
    </li>
  {% empty %}
    <li> No topics have been added yet. </li>
  {% endfor %}
</ul>

<a href="{% url 'blogs:new_post' %}">Add a new blogpost.</a>

{% endblock content %}

edit_post.html

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

{% block content %}

  <p>{{ post }}</p>

  <p>Edit post:</p>

  <form action="{% url 'blogs:edit_post' post.id %}" method='post'>
    {% csrf_token %}
    {{ form.as_p }}
    <button name="submit">Save changes</button>
  </form>

{% endblock content %}

미리 감사드립니다.

자 피르

문제는 edit_post()보기 기능 에 있다고 생각합니다 . 다음은 if 블록의 첫 번째 부분입니다.

    if request != 'POST':
        form = NewPostForm(instance=post)

다음과 같아야한다고 생각합니다.

    if request.method != 'POST':
        form = NewPostForm(instance=post)

요청 방법이인지 확인합니다 POST. .method부분을 중단했습니다 request.method. 요청 객체 자체는 절대로되지 않으므로이 'POST'블록은 요청 메서드가 POST 인 경우에도 항상 실행됩니다.

if 블록에서로 변경 request하면 request.method게시물을 수정할 수 있다고 믿습니다 .

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

Related 관련 기사

뜨겁다태그

보관