Nano Hash - криптовалюты, майнинг, программирование

Не удается сохранить изменения для редактирования блога Django ModelForm; форма возвращается в предыдущее состояние

Я прочитал два других сообщения, связанных с этой темой, но не смог найти никаких решений для моей проблемы - я не могу получить форму edit_post (edit_post.html), чтобы сохранить изменения, внесенные в форму, и либо перенаправить обратно в индекс страницу или визуализировать страницу с сохраненными изменениями. После нажатия кнопки Сохранить изменения форма возвращается к предыдущему предварительно заполненному состоянию экземпляра до внесения изменений.

Это упражнение 19-1 из Ускоренного курса Python:

19-1. Блог: запустите новый проект Django под названием «Блог». Создайте в проекте приложение под названием blogs и модель под названием BlogPost. Модель должна иметь такие поля, как title, text и date_added. Создайте суперпользователя для проекта и используйте сайт администратора, чтобы сделать пару коротких сообщений. Создайте домашнюю страницу, на которой будут отображаться все сообщения в хронологическом порядке. Создайте форму для создания новых сообщений и другую для редактирования существующих сообщений. Заполните формы, чтобы убедиться, что они работают.

модели.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}"

формы.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:"}

просмотры.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 %}

Заранее большое спасибо.

16.02.2021

Ответы:


1

Я думаю, что проблема в функции просмотра edit_post(). Вот первая часть блока if:

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

Я считаю, что должно быть:

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

Это проверяет, является ли метод запроса POST. Вы пропустили .method часть request.method. Сам объект запроса никогда не будет 'POST', поэтому этот блок всегда выполняется, даже если метод запроса POST.

Я считаю, что если вы измените request на request.method в блоке if, вы сможете редактировать сообщения.

17.02.2021
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..