Django:绕过表单验证?

Django:绕过表单验证?,django,django-forms,Django,Django Forms,类似于,但那里的解决方案对我不起作用 基本上,我正在尝试这样做: if request.method == 'POST': profile_form = UserProfileForm(request.POST) # ... else: profile_form = UserProfileForm(request.GET) 但是表单会在GET上得到验证。使用initial=request.GET也不起作用,因为每个条目都是列表而不是字符串。i、 例如,如果我尝试转到my

类似于,但那里的解决方案对我不起作用

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

if request.method == 'POST':
    profile_form = UserProfileForm(request.POST)
    # ...
else:
    profile_form = UserProfileForm(request.GET)
但是表单会在GET上得到验证。使用
initial=request.GET
也不起作用,因为每个条目都是列表而不是字符串。i、 例如,如果我尝试转到
myform?company=mycompany
mycompany
字段设置为
[u'mycompany']


有没有其他方法可以绕过验证,或者有没有一种简单的方法可以将
querydict
转换为常规dict(没有列表)?

您可以将
请求。将
转换为包含非列表值的字典,如下所示:

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()
放入。。。如果表单上也有前缀,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'))

尽管您似乎已经找到了解决方案,为什么不使用从UserProfileForm继承的form类,比如NoValidationUserProfileForm?在这种情况下,您可以在所有字段上循环设置
required=False

class NoValidationUserProfileForm(UserProfileForm):

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

哈!它起作用了,但后来只尝试了
request.GET.items()
,它只给了我每个项目的第一个字母,这表明它们不再是列表,而是字符串。结果是
initial=request.GET.items()
按原样工作。你可以有+1,但这似乎是一项更大的工作。我不同意。我认为它更具可读性。重写uuu init_uuuuuu()不一定是黑客行为。不。。。不是覆盖的
\uuuu init\uuuu
,而是需要每个表单的第二个版本,并禁用
所需的
,以避免显示一些错误消息。