我有一个无效的绑定ModelForm

时间:2017-07-13 11:33:15

标签: python django django-forms

我正在尝试创建一个链接到外部数据库的ModelForm,当您提交表单时,外部数据库会更新。当我检查表单的有效性时,问题就出现了,它是无效的。

我已经对此做了一些研究,发现最常见的问题是表单没有绑定,但是当我使用print(form.non_field_errors)时,我得到: <bound method BaseForm.non_field_errors of <EmailForm bound=True, valid=False, fields=(subject;body;name;altsubject;utm_source;utm_content;utm_campaign)>

models.py:

class MarketingEmails(models.Model):
    messageid = models.AutoField(db_column='column1', primary_key=True)
    subject = models.CharField(db_column='column2', max_length=2000)
    body = models.TextField(db_column='column3') #using a text field as there is no maximum length
    name = models.CharField(db_column='column4', max_length=25)
    altsubject = models.CharField(db_column='column5', max_length=2000)
    utm_source = models.CharField(db_column='column6', max_length=25)
    utm_content = models.CharField(db_column='column7', max_length=25)
    utm_campaign = models.CharField(db_column='column8', max_length=25)

class Meta:
    managed = False
    db_table = ''

forms.py:

class EmailForm(forms.ModelForm):
    class Meta:
        model = MarketingEmails
        fields = ['messageid','subject','body','name','altsubject','utm_source','utm_content','utm_campaign']

views.py:

def emailinfo(request, pk):
    if request.session.has_key('shortname'):
        shortname =  request.session['shortname']
        rows = get_object_or_404(MarketingEmails, pk=pk)
        if request.method == 'POST':
            form = EmailForm(request.POST)
            print(form.errors)
            print(form.non_field_errors)
            if form.is_valid():
                form.save()
                print("form is valid")
                return redirect('marketingemails:emailinfo', pk = rows.messageid)

        return render(request, 'marketingemails/emailinfo.html',{'shortname': shortname, 'rows': rows})
    else:
        return HttpResponseRedirect(reverse('common:login'))

urls.py:

app_name = 'marketingemails'
urlpatterns = [
url(r'^marketing/emails/(?P<pk>[0-9]+)/$', marketingviews.emailinfo, name='emailinfo'),
]

HTML:

        <form method="POST" class="post-form" action ="">
    {% csrf_token %}
        <label for="exampleTextarea">Name</label>
        <textarea class="form-control" id="exampleTextarea" rows="1">{{ rows.name }}</textarea>

        <label for="exampleTextarea">Subject</label>
        <textarea class="form-control" id="exampleTextarea" rows="1">{{ rows.subject }}</textarea>

        <label for="exampleTextarea">Alternative Subject</label>
        <textarea class="form-control" id="exampleTextarea" rows="1">{{ rows.altsubject }}</textarea>

        <label for="exampleTextarea">Body</label>
        <div class="ibox-content no-padding">
            <div class="summernote">
                {{ rows.body }}
            </div>
        </div>
        <label for="exampleTextarea">utm_source</label>
        <textarea class="form-control" id="exampleTextarea" rows="1">{{ rows.utm_source }}</textarea>

        <label for="exampleTextarea">utm_content</label>
        <textarea class="form-control" id="exampleTextarea" rows="1">{{ rows.utm_content }}</textarea>

        <label for="exampleTextarea">utm_campaign</label>
        <textarea class="form-control" id="exampleTextarea" rows="1">{{ rows.utm_campaign }}</textarea>

        <button type="submit" class="save btn btn-default">Save</button>
    </form>

1 个答案:

答案 0 :(得分:2)

您的HTML表单没有为这些字段命名,因此表单无法获取它们。您也希望使用表单进行渲染:https://docs.djangoproject.com/en/1.11/topics/forms/#working-with-form-templates