Django:绕过表单验证?

时间:2011-06-11 19:30:24

标签: django django-forms

this类似,但解决方案对我不起作用。

基本上,我正在尝试这样做:

if request.method == 'POST':
    profile_form = UserProfileForm(request.POST)
    # ...
else:
    profile_form = UserProfileForm(request.GET)

然后表格在GET上得到验证。使用initial=request.GET代替不起作用,因为每个条目都是列表而不是字符串。即,如果我尝试转到myform?company=mycompany,则mycompany字段设置为[u'mycompany']

是否存在绕过验证的不同方法,或者是否有一种简单的方法可以将querydict转换为常规字典(没有列表)?

3 个答案:

答案 0 :(得分:2)

您可以将request.GET转换为字典,其值不是这样的列表:

initial = dict(map(lambda x:(x[0], x[1][0]), dict(request.GET).items()))
profile_form = UserProfileForm(initial=initial)

这将获取每个列表中的第一个项目,这意味着只有当您的所有输入都有不同的名称(他们应该或您没有做正确的事情)时它才会起作用。如果有效,请告诉我。

您可能不需要dict(request.GET).items(),您可以放置​​request.GET.items()

答案 1 :(得分:1)

Bah ...如果表单上有前缀,Bryce的解决方案将无效。我们不得不削减它:

def initdict(querydict, prefix=None):
    if prefix is None:
        return querydict.items()
    p = prefix + '-'
    l = len(p)
    return dict((k[l:],v) for k,v in querydict.iteritems() if k.startswith(p))

用法:

profile_form = UserProfileForm(prefix='profile', initial=initdict(request.GET, prefix='profile'))

答案 2 :(得分:1)

虽然您似乎已经找到了解决方案,但为什么不使用继承自UserProfileForm的表单类,如NoValidationUserProfileForm?在这种情况下,您可以遍历所有字段以设置required = False

class NoValidationUserProfileForm(UserProfileForm):

    def __init__(self, *args, **kwargs):
        super(NoValidationUserProfileForm, self).__init__(*args, **kwargs)
        self.fields['myfield'].required = False