【问题标题】:form.is_valid() is returning False when using ModelForm使用 ModelForm 时 form.is_valid() 返回 False
【发布时间】:2018-06-25 11:58:39
【问题描述】:

我正在使用 ModelForm 创建一个表单,让用户上传文件和描述。 is_valid() 函数没有返回 true,我真的很困惑。我已经搜索过,有许多与我的标题相同的问题,但它们并没有解决我的问题。

这是forms.py:

class PostForm(forms.ModelForm):
    document = forms.FileField(widget=forms.FileInput)

class Meta:
    model = FeedModel
    fields = ['description', 'document']

这里是models.py:

class FeedModel(models.Model):
    description = models.CharField(max_length=255, blank=True)
    document = models.FileField()
    like = models.IntegerField(default=0)
    dateTime = models.DateTimeField(auto_now=True, auto_created=True)
    user = models.ForeignKey(User, on_delete=models.CASCADE, default=0)

    def get_absolute_url(self):
        u=self.user
        return reverse('home:feed',u.primary_key)

这里是views.py:

class PostView(CreateView):
    form_class = PostForm
    template_name = 'home/feedModel_form.html'

    def get(self, request, *args, **kwargs):
        form=self.form_class(None)
        return render(request, self.template_name, {'form':form })

    def post(self, request, *args, **kwargs):
        logger = logging.getLogger(__name__)
        form=self.form_class(request.POST)

        if form.is_valid():
            user=request.user
            self.object=form.save(commit=False)
            self.object.user=user
            self.object.save()
            logger.error("voila")
            redirect({'home:feed'}, user.id)


        return render(request, self.template_name, {'form':form })


def feedview(request, user_id):
    user = User.objects.get(pk=user_id)
    return render(request, 'home/feed.html', {'user': user})

这里是 feedModel_form.html:

{% extends 'home/navbar.html' %}
{% block body %}

<div class="form">
    <form action="" method="post" enctype="multipart/form-data">
        {% csrf_token %}
        {% include 'home/form.html' %}
        <button type="submit" class="button button-block"  ` 
         name="reg_btn">Post</button>`
    </form>
</div>

{% endblock %}

这里是form.html:

{% for field in form %}
<div class="field-wrap">
    <label>
    {{ field.label_tag }}<span class="req">*</span>
    </label>
    <div>{{ field }}</div>
</div>
{% endfor %}

【问题讨论】:

    标签: python django django-forms modelform


    【解决方案1】:

    您的 document 字段需要上传的文件并且是必需的。为了让表单真正获取文件,您还必须在views.py中将上传的文件传递给它:

    form = self.form_class(data=request.POST, files=request.FILES)
    

    【讨论】:

      【解决方案2】:

      要查看表单无效的原因,您应该查看form.errors

      一个错误是因为您没有将request.FILES 传递给表单。

      form=self.form_class(request.POST, request.FILES)
      

      可能还有其他错误。如果你在模板中使用了{{ form }},Django 会自动包含错误。由于您是 rendering the fields manually,因此您可以自行决定是否包含错误。

      这里的关键问题是你已经覆盖了post。这意味着您错过了来自CreateView 的大量代码。

      在您的情况下,您似乎可以删除 post 方法,而只需覆盖 form_valid

      def form_valid(self, form):
          self.object=form.save(commit=False)
          self.object.user=user
          self.object.save()
          # Note that you had {'home:feed'} here which was incorrect
          return redirect('home:feed', user_id)
      

      【讨论】:

      • 非常感谢!我被卡住了很长一段时间。
      猜你喜欢
      • 2021-11-08
      • 2020-04-06
      • 2014-01-10
      • 2020-05-09
      • 2014-12-27
      • 2018-01-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多