Django 表单不运行 form.is_valid

Posted

技术标签:

【中文标题】Django 表单不运行 form.is_valid【英文标题】:Django form doesn't runs form.is_valid 【发布时间】:2018-03-20 06:44:20 【问题描述】:

我正在处理一个 Django 自定义表单: 我已经调试了 form.is_valid 函数没有运行,即使所有数据都在视图中。

models.py

choices = (
   ('yes', 'Yes'),
   ('no', 'No'),
   ('not sure', 'Not Sure'),
)
class TaggedArticle(models.Model):
   user = models.ForeignKey(User, related_name='tagging')
   category_fit = models.CharField(choices=choices, max_length=255)
   article = models.ForeignKey(Article, related_name='articles')
   relevant_feedback = models.TextField(blank=True)
   created_at = models.DateTimeField(default=timezone.now, editable=False)

forms.py

class TagForm(forms.ModelForm):
    class Meta:
        model = TaggedArticle
        fields = ('user', 'category_fit', 'article', 'relevant_feedback')
        widgets = 
            'category_fit': forms.Radioselect()
        

views.py

def post(self, request, *args, **kwargs):
    if request.method == 'POST':
        post_data = request.POST.copy()
        post_data.update('user': request.user.pk)
        form = forms.TagForm(post_data)
        print('request recieved')
        if form.is_valid():
            tag = TaggedArticle()
            tag.user = request.user
            article = Article.objects.all().filter(id=form.cleaned_data['article'])
            tag.category_fit = form.cleaned_data['category_fit']
            tag.article = article
            tag.relevant_feedback = form.cleaned_data['relevant_feedback']
            tag.save()

        return HttpResponse('Tagged Successfully!', status=200)

更新 我认为这是单选按钮错误: 以下是我从我的模板中获取此信息的方式:

<td><label class="radio-inline"><input type="radio" name="category_fit">Yes</label></td>
<td><label class="radio-inline"><input type="radio" name="category_fit">No</label></td>
<td><label class="radio-inline"><input type="radio" name="category_fit">Not Sure</label>

请帮帮我! 提前致谢!

【问题讨论】:

【参考方案1】:

试试看:

    if form.is_valid():
        tag = form.save(commit=False)
        tag.user = request.user
        tag.save()
   else:
        # Added else statment
        msg = 'Errors: %s' % form.errors.as_text()
        return HttpResponse(msg, status=400)

您需要将value attr 添加到您的radio

<td><label class="radio-inline"><input type="radio" name="category_fit" value="yes">Yes</label></td>
<td><label class="radio-inline"><input type="radio" name="category_fit" value="no">No</label></td>
<td><label class="radio-inline"><input type="radio" name="category_fit" value="not sure">Not Sure</label>
                                                                     <!-- ^^^^^^^^^^  -->

【讨论】:

你的表单有错误,我更新了答案,你可以试试 我认为这是 category_fit 单选选项的错误,如何在我的模板中使用此单选按钮?请! 我是否必须在我的 forms.py 中的'category_fit': forms.RadioSelect() 中添加一些属性? 现在它返回另一个错误:int() argument must be a string, a bytes-like object or a number, not 'Article' 很高兴为您提供帮助!您应该接受其他有相同问题的人的答案,他们将搜索解决方案【参考方案2】:

在调用 form.is_valid() 之后,调用 form.errors 并打印它以了解表单的预期输入。

form.is_valid()
print(form.errors)

from django.http import HttpResponse

form.is_valid()
return HttpResponse(form.errors)

【讨论】:

HttpResponse 返回 category_fit! 表示获取表单数据时category_fit字段有问题 我必须在'category_fit': forms.RadioSelect() inside my forms.py中添加一些属性吗? 是的,您需要按照@bear brown 的建议添加值字段

以上是关于Django 表单不运行 form.is_valid的主要内容,如果未能解决你的问题,请参考以下文章

Django脆表单不加载CSS

不刷新的Django表单类

django 表单验证和字段验证

将表单添加到 Django DetailView 错误消息:不允许的方法(POST)

Django、TinyMCE 字段序列化不一致

我不小心在 django 中删除了我的密钥表单 settings.py