form.is_valid() 在使用 ModelForm 时返回 False
form.is_valid() is returning False when using ModelForm
我正在使用 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 %}
您的 document
字段需要一个已上传的文件并且是必需的。为了让表单真正获取文件,您还必须将上传的文件传递给 views.py:
form = self.form_class(data=request.POST, files=request.FILES)
要了解表单无效的原因,您应该检查 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)
我正在使用 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 %}
您的 document
字段需要一个已上传的文件并且是必需的。为了让表单真正获取文件,您还必须将上传的文件传递给 views.py:
form = self.form_class(data=request.POST, files=request.FILES)
要了解表单无效的原因,您应该检查 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)