Skip to main content
 首页 » 编程设计

python之Django / python : form data doesn't get stored in database

2024年10月25日37unruledboy

Django 1.8/Python 3.4

我想通过名为“add”的 Django View 将 html 表单中的数据添加到我的数据库中。但是,由于某种原因,这并没有发生,我也不知道出了什么问题。大概错误出在 View 的代码中,但我到底需要更改什么?

模型.py

from django.db import models 
from model_utils import Choices 
 
class Entry(models.Model): 
    user = models.CharField(max_length=50) 
    title = models.CharField(max_length=200) 
    description = models.TextField() 
    due_date = models.DateField('Date') 
    due_time = models.TimeField('Time') 
    STATUS = Choices('Open', 'Done') 
    status = models.CharField(choices=STATUS, default=STATUS.Open, max_length=4) 
 
def __unicode__(self): 
    return u"%s %s %s %s %s" % (self.user, self.title, self.description, self.expiry, self.status) 
 
def expiry(self): 
    return u"%s %s" % (self.due_date, self.due_time) 

我的 add.html 中有趣的部分

    <td><input type="text" name="title"></td> 
    <td><input type="text" name="description"></td> 
    <td><input type="text" name="due_date"></td> 
    <td><input type="text" name="due_time"></td> 
    <td> 
        <select name="status" size="1" selected value="Open"> 
            <option>Open</option> 
            <option>Done</option> 
        </select> 
    </td> 

表单.py

from django import forms 
from django.forms.widgets import TextInput 
 
class EntryForm(forms.Form): 
    title = forms.CharField(max_length=200) 
    description = forms.widgets.TextInput() 
    due_date = forms.DateField() 
    due_time = forms.TimeField() 
    status = forms.ChoiceField(choices=[(x, x) for x in range(1, 2)]) 

以及我views.py中的相关 View

from django import forms 
from django.shortcuts import render 
from django.shortcuts import redirect 
from website.list.forms import EntryForm 
 
def add(request): 
    if request.method == "POST": 
        form = EntryForm(request.POST)  
        if form.is_valid(): 
            new_entry = form.save() 
            new_entry.save() 
            return redirect('website') 
    else: 
        form = EntryForm()  
    return render(request,'add.html', {'form': form}) 

感谢任何帮助!


[编辑]

所以,这就是我的 add.html 现在的样子:

<form action="." method="post"> 
{% csrf_token %} 
{{ form }} 
    <br><input type="submit" value="Send"/> 
    <br><br><a href="{% url 'overview' %}">Cancel</a> 
</form> 

再次对 views.py 稍加修改:

from django import forms 
from django.shortcuts import render 
from django.shortcuts import redirect 
from www.todolist.forms import EntryForm 
from django.contrib.auth.models import User 
 
def add(request): 
    if request.method == "POST": 
        form = EntryForm(request.POST)  
        if form.is_valid()) 
            form.save() 
            return redirect('website') 
    else: 
        form = EntryForm()  
    return render(request,'add.html', {'form': form}) 

请您参考如下方法:

想通了... 为了让 save() 函数在 View 中工作,forms.py 必须如下所示:

class EntryForm(forms.ModelForm): 
CHOICES = ( 
    ('1', 'Open'), 
    ('2', 'Done'), 
) 
title = forms.CharField(max_length=200) 
description = forms.CharField(widget=forms.Textarea) 
due_date = forms.DateField() 
due_time = forms.TimeField() 
status = forms.ChoiceField(choices=CHOICES) 
 
class Meta: 
    model = Entry 
    fields = '__all__' 

需要注意的重要事项是“ModelForm”,而不仅仅是“Form”和类元信息。