Django ModelForm 不保存数据

Posted

技术标签:

【中文标题】Django ModelForm 不保存数据【英文标题】:Django ModelForm not saving data 【发布时间】:2014-05-15 21:44:06 【问题描述】:

我尝试了以下帖子的解决方案:

Saving data from ModelForm:没用

ModelForm data not saving django:没用。

我正在尝试将数据从 ModelForm 保存到模型中。

models.py:

class Testimonials(models.Model):
    name = models.CharField(max_length=128)
    credentials = models.CharField(max_length=128)
    test = models.CharField(max_length=2000)
    id = models.AutoField(primary_key=True)
    NO = 'NO'
    YES = 'YES'
    APPROVAL = ((NO, 'no'), (YES, 'yes'))
    verified = models.CharField(choices=APPROVAL, default=NO, max_length=3) #Field for making sure only verified testimonials are displayed

    def __unicode__(self):
        return self.id

forms.py:

class TestimonialForm(forms.ModelForm):
    name = forms.CharField(widget=forms.TextInput(attrs='class': 'form-control input-area', 'placeholder': 'Enter your name'), required=True)
    credentials = forms.CharField(widget=forms.TextInput(attrs='class': 'form-control input-area', 'placeholder': 'Enter your designation'), required=True)
    test = forms.CharField(widget=forms.Textarea(attrs='class': 'form-control test-form-area', 'placeholder': 'Testimonial', 'rows': '5'), required=True)
    verified = forms.ChoiceField(widget=forms.HiddenInput())

    class Meta:
        model = Testimonials  

views.py

def add_testimonial(request):
    context = RequestContext(request)
    if request.method == 'POST':
        form = TestimonialForm(request.POST)

        if form.is_valid():
            form.save(commit=True)
            return HttpResponseRedirect('/testimonials/thanks/')
        else:
            print form.errors

    else:
        form = TestimonialForm()

    return render_to_response('templates/add_testimonial.html', 'form': form, context)

模板:

<form id="testimonial_form" method="POST" action="/testimonials/thanks/">
    % csrf_token %
    % for hidden in form.hidden_fields %
         hidden 
    % endfor %
    % for field in form.visible_fields %
         field.help_text
         field 
    % endfor %
    <input type="submit" name="submit" value="Add testimonial" class="btn btn-info test-button"/>
</form>

编辑:

urls.py

url(r'^testimonials/all/', views.testimonials, name='testimonial'),
url(r'^testimonials/thanks/', views.testimonials_thanks, name='testimonial_thanks'),
url(r'^add_testimonial', views.add_testimonial, name='add_testimonial'),

但是,在重定向时,它不会将表单保存到我从 phpMyAdmin(使用 mysqldb)和 Django 管理面板检查的模型中。知道为什么吗?

【问题讨论】:

【参考方案1】:

您正在 POST 到 /testimonials/thanks/,应将其更改为您的 add_testimonial 路由以让您的视图处理 POST。因此,解决方案是更改模板表单标签中的action 值。

如果您可以从 urls.py 中发布相关代码,我可以就 action 属性的值提供更具体的答案。

更新

当发布有效表单时,重定向将在您的视图中发生。将模板的 action 属性值更改为:

<form id="testimonial_form" method="POST" action="% url 'add_testimonial' %">

在你看来:

if form.is_valid():
    form.save()
    return HttpResponseRedirect(reverse('testimonial_thanks'))

并确保在视图中包含以下导入:

from django.core.urlresolvers import reverse

更新 2

在模板中显示表单错误:

<form id="testimonial_form" method="POST" action="% url 'add_testimonial' %">
    % csrf_token %
    % if form.non_field_errors %
        <div class="form-group text-error">
             form.non_field_errors 
        </div>
    % endif %

    % for hidden in form.hidden_fields %
         hidden 
    % endfor %
    % for field in form.visible_fields %
         field.help_text
         field 
        % if field.errors %
            <span> field.errors|striptags </span>
        % endif %
    % endfor %
    <input type="submit" name="submit" value="Add testimonial" class="btn btn-info test-button"/>
</form>

更新 3

现在您可以看到表单错误,您需要为隐藏字段提供默认值,如果用户别无选择,则无需将其设为 ChoiceField(它已隐藏!)。因此将verified 表单字段更改为:

verified = forms.CharField(widget=forms.HiddenInput(), initial='no')

此外,验证视图中的值也是一个好主意,因为即使该字段被隐藏,一个有进取心、邪恶的用户仍然可以发布其他值。

【讨论】:

添加了 urls.py。此外,我的原始代码确实具有“add_listing”的作用。保存到模型中,但我想在成功时重定向到另一个 url,所以我将操作更改为 testimonials/thanks 太好了,我已经更新了我的答案。让我知道你们相处得怎么样。 在views.py 中要进行哪些更改?因为我试过这个,没有效果。它没有重定向到testimonials/thanks/。如果有帮助,我在控制台中的表单数据如下:verified:name:Savecredentials:Savetest:Savesubmit:Add testimonial 好的,您可能需要在视图中使用您的“谢谢”网址名称。查看更新 似乎不起作用。你可以试试here

以上是关于Django ModelForm 不保存数据的主要内容,如果未能解决你的问题,请参考以下文章

如何在编辑内容并将javascript变量传递给它的新输入字段后将Django“forms.ModelForm”保存在数据库中

跟进:缺少 django Modelform 中所需的 Charfield 被保存为空字符串并且不会引发错误

ImageField() 不在 ModelForm 中保存图像 - Django/Python

为啥我无法保存 Django ModelForm 博客的编辑?

Django-profiles 自定义创建/编辑 modelForm 未正确保存

使用覆盖保存为抽象模型扩展 Django ModelForm