почему модель django не может сохранить мой новый объект, когда я нажимаю кнопку создания в 'create. html' - PullRequest
1 голос
/ 06 августа 2020

Начинаю использовать Django, и у меня проблемы. Я хочу создать новый пост, например блог. Поэтому я использую views.py с model.py и forms.py. но когда я ввожу команду create. html, я писал то, что хочу опубликовать, а затем нажимал кнопку «создать». но это не было сохранено в объекте django. Проверяю в админке, но возражений нет. Я думаю, это означает, что сохранить объект не удалось. но я не знаю, в чем проблема. пожалуйста, помогите мне TT

в views.py

def create(request):
    if request.method =="POST":
        filled_form = ObForm(request.POST)
        if filled_form.is_valid():
            filled_form.save()
            return redirect('index')
    Ob_form = ObForm()
    return render(request, 'create.html', {'Ob_form':Ob_form})

в create. html

<body>
    <!-- form.py 모델 생성 -->
    <form method="POST" action="">
      {% csrf_token %}}
      {{Ob_form.as_p}}
      <input type="submit" value="확인" />
    </form>
  </body>

в models.py

from django.db import models

class Ob(models.Model):
    title = models.CharField(max_length=50)
    image = models.ImageField(null=True)
    content = models.TextField(null=True)
    update_at = models.DateTimeField(auto_now=True)

в forms.py

from django import forms
from .models import Ob

# 모델폼을 상속받아서 모델폼이 되었음
class ObForm(forms.ModelForm):
# 어떤 모델과 대응되는지 말해줌
    class Meta:
        model = Ob
        fields = ( "title", "image", "content")

# 모델 폼 커스텀
# init - 내장함수 - (해당 클레스에 들어오는 여러가지 인자를 받을 수 있는 파라미터)
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.fields['title'].label = "제목"
        self.fields['image'].label = "사진"
        self.fields['content'].label = "자기소개서 내용"
        self.fields['title'].widget.attrs.update({
            'class': 'Ob_title', 
            'placeholder': '제목',
        })

и urls.py

from django.urls import path
from .views import index, create, detail, delete, update


urlpatterns = [
    path('', index, name="index"),
    path('create/', create, name="create"),
    path('detail/<int:Ob_id>', detail, name="detail"),
    path('delete/<int:Ob_id>', delete, name="delete"),
    path('update/<int:Ob_id>', update, name="update"),
]

1

1 Ответ

1 голос
/ 06 августа 2020

Здесь немного догадок, но, вероятно, filled_form.is_valid() возвращает false, что означает, что save() никогда не достигается. Чтобы проверить это просто, просто поместите else и print на if.

if filled_form.is_valid():
    filled_form.save()
    return redirect('index')
else:
    print("Form validation failed")
    print(filled_form.errors)

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

Прямо сейчас, независимо от того, успешно ли ObForm проверяется, вы создаете новый экземпляр и передаете его пользователю. Мой типичный подход - объявить переменную формы в верхней части функции, и если она еще не установлена, когда дело доходит до рендеринга представления, тогда создайте новый экземпляр формы. Таким образом, если форма уже была заполнена пользователем (т.е. запрос был POST), то ошибки будут возвращены вместе с их вводом, вместо того, чтобы очищать их ввод (что действительно раздражает с точки зрения пользователя!).

В качестве примечания, я собираюсь предположить, что вы отправили форму с пустыми полями изображения и содержимого и ожидали, что она будет сохранена в вашей базе данных? Попробуйте изменить объявления полей на:

title = models.CharField(max_length=50)
image = models.ImageField(null=True, blank=True)
content = models.TextField(null=True, blank=True)
update_at = models.DateTimeField(auto_now=True)

null=True сообщает базе данных о разрешении пустых значений, но blank=True сообщает валидации формы о разрешении пустых значений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...