在Django中对form.cleaned_data[i]使用rstrip

1 投票
2 回答
1124 浏览
提问于 2025-04-11 18:34

在我的views.py文件中,有一段代码是这样的:

def clean_post_data(form):
    for i in form.cleaned_data:
        form.cleaned_data[i] = form.cleaned_data[i].rstrip()

def add_product(request):   
    form = ProductForm(request.POST, request.FILES or None)
    image = Image.objects.all()
    action = "Add"

    if request.POST:
        if form.is_valid():
            clean_post_data(form)
            form.save()
            action = "Added new product"
            return render_to_response('cms/admin/action.html', {'action' : action},context_instance=RequestContext(request))
        else:
            action = "There was an error. Please go back and try again"
            return render_to_response('cms/admin/action.html', {'action' : action}, context_instance=RequestContext(request))

    return render_to_response('cms/admin/editproduct.html', {'form' : form, 'action' : action, 'image' : image}, context_instance=RequestContext(request))

但是当我运行这段代码时,出现了一个错误:'list' object has no attribute 'rstrip'。我哪里做错了呢?

我最开始是在视图里直接写了for i in form.cleaned_data:这个循环,那时候一切都正常,但现在我尝试这样做时又出现了同样的错误。http://dpaste.com/92836/

2 个回答

0

很可能你的表单里有几个元素的名字是一样的。当你提交表单时,返回的 cleaned_data 中会有一个元素是列表。

如果你想跳过这些情况(或者对它们做一些特别处理),你需要进行检查:


def clean_post_data(form):
    for i in form.cleaned_data:
        if('__iter__' in dir(form.cleaned_data[i])):
            print "skip this element: " + str(form.cleaned_data[i])
        else:
            form.cleaned_data[i] = form.cleaned_data[i].rstrip()
1

clean_post_data 这个函数不应该单独存在。

它应该作为一个方法放在表单里面,叫做 clean。你可以查看 表单和字段验证 的相关内容。

撰写回答