【问题标题】:form.is_valid(): always returns falseform.is_valid():总是返回 false
【发布时间】:2014-12-27 15:07:12
【问题描述】:

Form.is_valid() 总是返回 false。这是我的代码。

#urls.py
url(r'^create/', "app.views.createpost", name="createpost"),

我的模型.py

class Post(models.Model):
    """docstring for Post"""
    post_image = AjaxImageField(upload_to='posts', max_width=200, max_height=200, crop=True, null= False, default='site_media/media/BobMarley/bob1.jpg')
    poster = models.ForeignKey(User, null= False, default=User.objects.get(username="admin")

这是我的forms.py

#forms.py
class AjaxImageUploadForm(forms.Form):
    image = forms.URLField(widget=AjaxImageWidget(upload_to='posts'))    

view.py

#views.py
def createpost(request):

    if request.method == 'POST':
        form = AjaxImageUploadForm(request.POST, request.FILES)
        if form.is_valid():
            newpost = Post(post_image = request.FILES['image'])
            newpost.poster = request.user
            newpost.save()

            return HttpResponseRedirect('/create/')


    else:
        form = AjaxImageUploadForm() # An empty, unbound form


    posts = Post.objects.all()

    return render_to_response('create.html',{'posts': posts, 'form': form},context_instance=RequestContext(request))

模板

#create.html
{% block extra_head %}    
    {{ form.media }}
{% endblock %}
{% block body %}
    <form method="POST" enctype="multipart/form-data" action="{% url "createpost" %}">      
        {% csrf_token %} 
        {{ form.errors}}
        {{ form.as_p }}
        <button type="submit" name='image'>Upload</button>
    </form>   
{% endblock %}

表单永远无效,并且打印的错误是“此字段是必需的”。 这是开始创建的表单小部件

<tr><th><label for="id_image">Image:</label></th><td><ul class="errorlist"><li>This field is required.</li></ul>
<div class="ajaximage"><a class="file-link" target="_blank" href=""> <img class="file-img" src=""></a> <a class="file-remove" href="#remove">Remove</a>
<input class="file-path" type="hidden" value="" id="id_image" name="image" /> <input type="file" class="file-input" name="image"/> <input class="file-dest" type="hidden" name="image" value="/ajaximage/upload/posts/0/0/0"> <div class="progress progress-striped active"> <div class="bar"></div></div>    
</div>
</td></tr>

我正在使用名为 django-ajaximage 的 django 包,它们的自定义小部件 (AjaxImageWidget) 可能是自定义文本小部件

class AjaxImageWidget(widgets.TextInput):

感谢您的帮助

【问题讨论】:

  • 表单对象在哪里创建?它的类在哪里?另外,正确缩进你的代码。
  • 你在 Post init 上的 super 对我来说看起来很奇怪
  • 你的模型类完全坏掉了。 __init__ 方法会主动阻止您创建填充实例,或从数据库加载实例。您应该完全删除它。
  • 非常感谢,我认为这是自动生成的,我一直不明白它的实际含义。
  • @Marcin 我真的不明白你的问题,这可能是因为我是 django 新手,你能详细说明一下吗?

标签: python django image forms


【解决方案1】:

您的模型类不需要 init。此外,null=False 是默认值。我不确定文本“admin”是否会默认为用户名为 admin 的用户。你需要这样做:

default=User.objects.get(username="admin")

您还可以像这样在对象的创建中包含海报分配:

newpost = Post(post_image=request.FILES['image'], poster=request.user)

要使表单生效,您需要在字段中输入 blank=True,如下所示:

poster = models.ForeignKey(User, blank=True, default=User.objects.get(username="admin")

我还将表单设为 ModelForm:

class AjaxImageUploadForm(forms.ModelForm):
    class Meta:
        model=Post
        exclude=['poster',]

【讨论】:

  • 感谢您的建议,但表单仍未验证
  • 非常感谢,为了继续使用我添加的同一个自定义小部件,我添加了这个小部件 = { 'post_image': AjaxImageWidget(upload_to='posts'), }
猜你喜欢
  • 2018-01-05
  • 1970-01-01
  • 2014-09-06
  • 1970-01-01
  • 1970-01-01
  • 2020-04-06
  • 2014-01-10
相关资源
最近更新 更多