python - Django ModelForm 不保存数据

标签 python django

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

Saving data from ModelForm : 没用

ModelForm data not saving django : 没用。

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

模型.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

表单.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  

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

编辑:

网址.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 管理面板检查的模型中。知道为什么吗?

最佳答案

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

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

更新

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

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

在你看来:

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

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

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

此外,最好在您的 View 中验证该值,因为即使该字段被隐藏,有进取心的恶意用户仍然可以发布其他值。

关于python - Django ModelForm 不保存数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23689235/

相关文章:

Django 为什么我的 post.count_views 增加了 2?

javascript - 无法将 CSRF token 添加到 Django POST 请求的 XMLhttpRequest

javascript - 在 Django 模板中动态生成动态表单

python - 用 Python 加密 SOAP 信封

python - Mock() 函数在 django2 中给出 TypeError

python - pandas 在层次索引级别上匹配

python - 二维随机游走,Python

django - 适用于Django Web开发的IDE

python - 连接列表中不由特定字符分隔的字符

python - 如何保存 PIL ImageGrab() img?