1. 程式人生 > >django表單使用forms.ModelForm

django表單使用forms.ModelForm

win7

python2.7

django 1.6.5

因為使用資料庫sqlite,專案中有models.py,所以使用方便的forms.ModelForm處理表單。

上傳影象檔案使用預設的defaultstorage。

1、settings.py裡增加兩行media的定義:

#Media
MEDIA_ROOT = 'e:/Depot/media'
MEDIA_URL = '/media/'

2、models.py

#coding: utf8
from django.db import models


class Product(models.Model):
    title = models.CharField(max_length=50, verbose_name='標題')
    description = models.TextField(verbose_name='描述')
    photo = models.ImageField(upload_to='product', verbose_name='圖片')
    price = models.DecimalField(max_digits=8, decimal_places=2, verbose_name='價格')


3、forms.py

from django import forms
from models import *



class ProductForm(forms.ModelForm):

    class Meta:
        model = Product
        fields = ['title', 'description', 'photo', 'price']


其他的程式碼沒寫。

4、views.py

def create_product(request):
    #create new
    if request.method == 'POST':
        form = ProductForm(request.POST or None, request.FILES)
        if form.is_valid():
            form.save()
    return render(request, 'depot2/create_product.html', locals())


資料中有影象欄位,因此例項化Form類時,要加上第2個引數requst.FILES。

這裡使用Model,所以不需要手動對欄位進行request.FILE的賦值。

5、template檔案

顯示錶單的HTML檔案,只需要注意,有檔案上傳時,要在<form>標籤上加入 enctype="multipart/form-data"。

這個地方和views的第2個值必須填寫。

否則會出現,提交表單,View也能看到資料,但就是不能提交到sqlite3裡面,也不能上傳檔案。


專案根目錄要建立media資料夾,可以看到 以upload_to的值為名在其下面建立了一個子目錄。


建立好models.py後,是使用 django-groundwork來生成程式碼和模板的。

搞這一通,是在學習 大俠 心內求法 寫的 《django實戰》,不過他沒有使用ImageField欄位,所以我卡在這裡。

也說明熟悉HTML物件屬性,比熟悉python語法有用。

要使用media的圖片,要在主urls.py如下:

from django.conf.urls import patterns, include, url
from django.conf.urls.static import static
from django.contrib import admin
import settings


admin.autodiscover()

urlpatterns = patterns('',
    # Examples:
    # url(r'^$', 'depot.views.home', name='home'),
    # url(r'^blog/', include('blog.urls')),

    url(r'^admin/', include(admin.site.urls)),
)+ static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)


不過上面只是測試時用,說是等生產環境,還是要釋出為static。