【问题标题】:Using ModelForm in Django to add to database在 Django 中使用 ModelForm 添加到数据库
【发布时间】:2012-06-05 18:55:15
【问题描述】:

刚接触 Django,我已经用尽了所有的论坛和教程,但我仍然无法将表单数据导入数据库。我有一个简单的模型,它包含一个名称和一个电子邮件字段,我最终将在程序中引用它们。单击提交后我可以加载不同的页面,但我的数据不会发布到数据库。我已经尝试了我能想到的一切,所以我的代码可能在这一点上被劫持了,但在当前的迭代中,这就是我所拥有的:

#models.py
    from django.db import models
from django.forms import ModelForm

class Patron(models.Model):
    name = models.CharField(max_length=200)
    email = models.EmailField(max_length=75)


    def _unicode_(self):
        return self.name

class PatronForm(ModelForm):
    class Meta:
        model = Patron

#view.py

from django.shortcuts import render_to_response, get_object_or_404
from patrons.models import Patron 
from django.template import RequestContext
from django.core.context_processors import csrf
from django.core.urlresolvers import reverse
from django.forms import ModelForm


def index(request):
    if request.method == 'POST':
        post = request.POST
        name = post['name']
        email = post['email']
        f = PatronForm(request.Post)
        new_patron = f.save()
    return render_to_response('patrons/index.html',
                               context_instance=RequestContext(request))

#html
 <body>
    <h1>/Picture Taker/</h1>



    <form aciton="." name="patron" method="post" >
    {% csrf_token %}

        <label>
            <div>name</div> <input type="text" name="name" id="name" value="{{name}}">
        </label>
        <label>
            <div>email</div> <input type="text" name="email" id="email" value="{{email}}">
        </label>

        <div class="error">{{error}}</div>
        <input type="submit" value="Submit">
    </form>

</body>

任何帮助将不胜感激

【问题讨论】:

    标签: django forms django-forms


    【解决方案1】:

    全部

    post = request.POST
    name = post['name']
    email = post['email']
    f = PatronForm(request.Post)
    new_patron = f.save()
    

    可以改写为(注意request.POST的大小写):

    f = PatronForm(request.POST)
    new_patron = f.save()
    

    但您应该在保存之前检查表单中的错误,所以:

    f = PatronForm(request.POST)
    if f.is_valid():
        new_patron = f.save()
    

    您的表单标签中还有一个错字,应该是“action”,而不是“aciton”。您在模板中的 {{ error }} 并不引用您视图中存在的任何内容。在调试时,让表单自己呈现可能会有所帮助,例如:

    {{ form.as_p }}
    

    这样您就可以在表单提交中看到任何错误。

    【讨论】:

    • Thanks@Tom 现在我在尝试提交全局名称“PatronForm”时收到此错误未定义 11 f = PatronForm(request.POST) ... ▶ Local vars
    • 在views.py中,你需要导入你的表单。为了保持一致性,它实际上应该位于一个名为“forms.py”的单独文件中,但在您的情况下,它看起来像“从 Patron.models 导入 PatronForm”
    【解决方案2】:

    您不需要“每个论坛和教程”,您只需要官方文档,其中this is explained clearly。您在该链接上看到的代码的唯一变化是您需要在“处理数据”位中添加form.save()(并且,您应该在 render_to_response 调用中使用 RequestContext,就像您已经做的那样)。

    另外要改变的是,你应该依赖 Django 来渲染模板中的整个字段,而不仅仅是值:

    <p>
    {{ form.name }} 
    {{ form.name.errors }}
    </p>
    
    <p>
    {{ form.email }}
    {{ form.email.errors }}
    </p>
    

    【讨论】:

    • 谢谢,对我的代码进行更改后,我得到以下信息:全局名称 'PatronForm' 未定义并出现以下错误 Traceback: File "/Library/Frameworks/Python.framework/Versions/ 2.7/lib/python2.7/site-packages/django/core/handlers/base.py" 在 get_response 111. response = callback(request, *callback_args, **callback_kwargs) 文件 "/Users/curtis/picturetaketest3/mysite/顾客/views.py”在索引 11 中。f = PatronForm(request.POST)
    • 好吧,你还没有将它导入到你的视图中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-10-10
    • 2018-07-07
    • 1970-01-01
    • 1970-01-01
    • 2013-08-19
    • 1970-01-01
    相关资源
    最近更新 更多