【问题标题】:Django/Python: form data doesn't get stored in databaseDjango/Python:表单数据未存储在数据库中
【发布时间】:2015-04-16 08:27:59
【问题描述】:

Django 1.8 / Python 3.4

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

models.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>

forms.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中的相关视图

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})

【问题讨论】:

    标签: python django django-forms


    【解决方案1】:

    想通了... 为了让 save() 函数在视图中工作,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”和类元信息。

    【讨论】:

      【解决方案2】:

      我猜你在这里遇到了错误; form = EntryForm(request.POST) 但是因为您是手动写出表单 html 而不是使用 Django 表单来执行此操作,所以您没有看到错误。

      https://docs.djangoproject.com/en/1.8/topics/forms/#the-template 是您应该如何使用 Django 为您的 Django 表单呈现 html;默认情况下,这将显示尝试验证数据时发生的任何错误。

      【讨论】:

      • 我猜你是对的,因为重定向也没有发生。所以在 save() 到数据库之前可能会出现问题?!我将阅读您链接的页面...
      • 请看一下我在开始帖子中的编辑:这现在给了我以下错误消息...“AttributeError at /add/ 'EntryForm' object has no attribute 'save'”跨度>
      • 哦,您可能想使用forms.ModelForm 而不仅仅是forms.Form。后者没有与之关联的保存方法。 docs.djangoproject.com/en/1.8/topics/forms/modelforms/…
      • 是的,确实如此。请在下面查看我的答案。
      猜你喜欢
      • 2021-10-11
      • 1970-01-01
      • 2020-10-07
      • 1970-01-01
      • 2021-10-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多