簡體   English   中英

Django form.is_valid() 總是假的

[英]Django form.is_valid() always false

我正在編寫登錄信息。 當我手工編寫表單時,我讓它工作了。

下面的代碼有效:

視圖.py

def login_view(request):
    if request.method == 'GET':
        return render(request, 'app/login.htm')
    if request.method == 'POST':
        username = request.POST.get('username', '')
        password = request.POST.get('password', '')
        user = auth.authenticate(username=username, password=password)
        if user is None:
            return HttpResponseRedirect(reverse('error'))
        if not user.is_active:
            return HttpResponseRedirect(reverse('error'))

        # Correct password, and the user is marked "active"
        auth.login(request, user)
        # Redirect to a success page.
        return HttpResponseRedirect(reverse('home'))

模板:

<form method="post" action="{% url 'login'  %}">
    {% csrf_token %}
    <p><label for="id_username">Username:</label> <input id="id_username" type="text" name="username" maxlength="30" /></p>
    <p><label for="id_password">Password:</label> <input type="password" name="password" id="id_password" /></p>

    <input type="submit" value="Log in" />
    <input type="hidden" name="next" value="" />
</form>

偉大的! 但是現在我想使用 Django 的表單來做同樣的事情。

下面的代碼不起作用,因為我總是得到 is_valid() == False。

視圖.py:

def login_view(request):
    if request.method == 'POST':
        form = AuthenticationForm(request.POST)
        print form.is_valid(), form.errors, type(form.errors)
        if form.is_valid():
            ## some code....
            return HttpResponseRedirect(reverse('home'))
        else:
            return HttpResponseRedirect(reverse('error'))
    else:
        form = AuthenticationForm()
    return render(request, 'app/login.htm', {'form':form})

模板:

<form action="{% url 'login' %}" method="post">{% csrf_token %}
{{ form.as_p }}
<input type="submit" value="Submit" />

stackoverflow 上有很多人抱怨他們得到 is_valid 總是錯誤的。 我已經閱讀了所有這些帖子,據我所知,我沒有犯任何這些錯誤。 我發現了一個新的錯誤:-)

編輯:我在代碼中添加了一個打印。 打開登錄視圖並提交時的輸出是

[27/Dec/2013 14:01:35] "GET /app/login/ HTTP/1.1" 200 910
False  <class 'django.forms.util.ErrorDict'>
[27/Dec/2013 14:01:38] "POST /app/login/ HTTP/1.1" 200 910

因此 is_valid() 為 False,但 form.errors 為空。

事實證明,Maxime 畢竟是對的(抱歉)-您確實需要data參數:

form = AuthenticationForm(data=request.POST)

但是,這樣做的原因是 AuthenticationForm 覆蓋了__init__的簽名,以將請求作為第一個位置參數。 如果您明確提供data作為 kwarg,它將起作用。

(不過,您仍然應該省略在錯誤時重定向的 else 子句:在這種情況下,最好讓表單重新呈現錯誤。)

查看form.errors這將幫助您找出原因。

如果出現這種情況,您沒有選擇(我試圖使用引導模態,但它不起作用),我必須這樣做,否則即使表單沒有問題,模態也會始終觸發(並且 is_valid 默認情況下始終為 False

我需要什么:

  • 單擊按鈕時顯示模態
  • 如果出現錯誤,則在同一頁面上顯示模態和錯誤。

在模態模板中:

{% if not brand_form.is_valid and brand_form.errors %}
        <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
        <script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.5.2/js/bootstrap.min.js"></script>
        <script type="text/javascript">
             $(window).on('load', (function() {
                $('#brandAddModal').modal('show');
             }));
        </script>
                    
          {{ brand_form.non_field_errors }}
{% endif %}

在視圖中:

def add_brand_form(request):
    form = BrandForm()
    if request.method == 'POST':
        form = BrandForm(data=request.POST)
        if form.is_valid():
            return HttpResponseRedirect('/home')
        else:
            return render(request, template_name='home.html', context={'brand_form':form})
        
    return render(request, template_name='modal_add_brand.html', context={'brand_form':form})

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM