django ValueError 질문입니다.

조회수 914회

admin페이지의 모델을 직접등록하면 문제없이 등록이 되는데, form을 통해서 즉, 글쓰기를 눌러서 나오는 new.html에서 내용을 작성하면 글이 올라가지질 않습니다. 수정을 눌러도 이미지를 제외한 제목과 내용만 수정되네요ㅠ 모델의 이미지 필드를 폼을 통해서 불러오고 DB에 올리는 과정에 문제가 있지 않을까 싶습니다.

글쓰기를 누르면 실행되는 함수는 blogpost입니다.

views.py

from django.shortcuts import render, get_object_or_404, redirect
from django.utils import timezone
from django.core.paginator import Paginator
from .models import Blog
from .form import BlogPost

def home(request):
    blogs = Blog.objects #쿼리셋
    #블로그 모든 글들을 대상으로
    blog_list = Blog.objects.all()
    #블로그 객체 세 개를 한 페이지로 자른다
    paginator = Paginator(blog_list, 3)
    #request된 페이지가 뭔지를 알아내고 (request 페이지를 변수에 담아내고)
    page = request.GET.get('page')
    #request된 페이지를 얻어온 뒤 return 해 준다
    posts= paginator.get_page(page)
    return render(request, 'home.html', {'blogs':blogs, 'posts':posts})

def detail(request, blog_id):
    details = get_object_or_404(Blog, pk = blog_id)
    return render(request, 'detail.html', {'details':details})

def new(request): #new.html을 띄워주는 함수
    return render(request, 'new.html')

def blogpost(request):
    # 1. 입력된 내용을 처리하는기능 -> POST
    if request.method == 'POST':
        form = BlogPost(request.POST)
        if form.is_valid(): #입력이 잘 됐는지 확인
            post = form.save(commit=False) #모델 객체를 반한하되, 저장하지 않고
            post.pub_data = timezone.now()
            post.save()
        return redirect('home')
    # 2. 빈페이지를 띄워주는 기능 -> GET
    else:
        form = BlogPost()
        return render(request, 'new.html', {'form':form})

def update(request, pk):
    #어떤 블로그를 수정할 지 블로그 객체를 갖고오기
    blog = get_object_or_404(Blog, pk = pk)
    #해당하는 블로그 객체의 pk에 맞는 입력공간을 가져오기
    form = BlogPost(request.POST, instance=blog)

    if form.is_valid():
        #입력받은 값이 유효한 값인지 확인
        form.save()
        return redirect('home')

    return render(request, 'new.html',{'form':form})

models.py

from django.db import models

class Blog(models.Model):
    title = models.CharField(max_length=200)
    pub_data = models.DateTimeField('data published')
    image = models.ImageField(upload_to='images/')
    body = models.TextField()

    def __str__(self):
        return self.title

    def summary(self):
        return self.body[:100]

form.py

from django import forms
from .models import Blog

class BlogPost(forms.ModelForm): #모델을 기반으로한 입력공간을 만들기 위해선
   class Meta:
        model = Blog #어떤모델
        fields = ['title', 'image', 'body'] #어떤 것을 입력받을지 >> 처리해주는 함수를 views.py에

템플릿에서의 글쓰기 링크설정

<a  href="{% url 'newblog' %}">글쓰기</a>

app폴더의 urls.py

from django.contrib import admin
from django.urls import path
from . import views

urlpatterns = [
    path('<int:blog_id>/', views.detail, name="detail"),
    path('new/', views.new, name="new"),
    # path('create/', views.create, name="create"),
    path('newblog/', views.blogpost, name="newblog"),
    path('update/<int:pk>',views.update, name="update"),#
    path('delete/<int:pk>',views.delete, name="delete"),

]

project폴더의 urls.py

from django.contrib import admin
from django.urls import path, include
import blogapp.views
from django.conf import settings
from django.conf.urls.static import static # 미디어파일을 이용하기 위해 임포트



urlpatterns = [
    path('admin/', admin.site.urls),
    path('', blogapp.views.home, name="home"),
    path('blog/',include('blogapp.urls')), #블로그앱 폴더안에 있는 urls로부터 include 해와라
]

urlpatterns += static(settings.MEDIA_URL, document_root = settings.MEDIA_ROOT)
  • (•́ ✖ •̀)
    알 수 없는 사용자
  • form.is valid > form.is valid() 로 수정해서 오류는 안뜨는데, 글쓰기해도 DB에 등록이 안됩니다 ㅠㅠ 알 수 없는 사용자 2019.8.6 20:12
  • commit=False 조건은 지우셨어요? 그리고 소스는 스샷이 아니라 텍스트 복붙으로 올리시는 것입니다. 위아래로 ``` 를 붙여서요. 엽토군 2019.8.6 22:57
  • 질문 수정했습니다! commit=False 조건이 있어야, 그 아래구문인 post.pub_data = timezone.now()를 통해서 자동으로 입력 시간을 넣을 수 있는 것 아닌가요? commit=False조건을 지우고 해도 똑같은 문제가 생깁니다. 알 수 없는 사용자 2019.8.7 19:52

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)