簡體   English   中英

需要在同一頁上顯示結果 - Django

[英]Need to show result on the same page - Django

我正在創建一個密碼生成器應用程序。 該應用程序正在運行並將值存儲在數據庫中。

問題是每當我刷新時,表單都會重新提交並采用以前的值並存儲。

另外,我想在同一頁面上顯示 email 和密碼。

每當我刷新時,我都想顯示一個帶有空字段的空表單。

視圖.py

def home(request):
    if request.method=='POST':
            inputemail = request.POST.get('InputEmail')
            gen = ''.join(random.choices((string.ascii_uppercase+string.ascii_lowercase+string.digits+string.punctuation), k=10))
            newpass = Item(email=inputemail,encrypt=gen)
            newpass.save()
            return render(request,'home.html',{"gen":gen})
        
    
    return render(request,'home.html',{})

家.html

<form method = 'post' id='pass-form' >
    {% csrf_token %}
    <div class="mb-3">
      <label for="exampleInputEmail1" class="form-label">Email address</label>
      <input type="email" class="form-control" name="InputEmail" >
      <div id="emailHelp" class="form-text">We'll never share your email with anyone else.</div>
    </div>
    
    <button type="submit" name = "submit" class="btn btn-primary">Generate Password</button><br><br>
  </form>
  
    <div class="mb-3">
        <label for="exampleInputPassword1" class="form-label">Generated Password</label>
        <input type="text" id="InputPassword" name = "genpassword" value = {{gen}} >
      </div>

網址.py

urlpatterns = [
    path('',views.home,name='home'),
]

根據文檔:

在成功處理 POST 數據后,你應該總是返回一個 HttpResponseRedirect。 此提示並非特定於 Django; 總的來說這是很好的 web 開發實踐。

所以你應該制作另一個頁面來顯示生成的密碼,它將采用在home視圖中創建的Item model 的提交實例 ID,因此:

def home(request):
    if request.method=='POST':
        inputemail = request.POST.get('InputEmail')
        gen = ''.join(random.choices((string.ascii_uppercase+string.ascii_lowercase+string.digits+string.punctuation), k=10))
        newpass = Item(email=inputemail,encrypt=gen)
        newpass.save()
        return redirect('success', args=(newpass.pk))
       
    return render(request,'home.html',{})

def success(request, pk):
    item_obj = get_object_or_404(Item, pk=pk)
    return render(request,'success.html', {'gen':item_obj.encrypt})

網址.py

urlpatterns=[
    path('',views.home,name='home'),
    path('success/<int:pk>/',views.success,name='success')
]

成功.html

<body>
    <h2>The form  is successfully submitted.</h2>
    <br> 
    <div class="mb-3">
            <label for="exampleInputPassword1" class="form-label">Generated Password</label>
            <input type="text" id="InputPassword" name="genpassword" value={{gen}} >
    </div>
    
    <a href="{% url 'home' %}"> Again go to password generator page.</a>
</body>


另一種可能的解決方案

您可以在required表單中創建 email 字段,然后在使用 Javascript 的submit事件提交表單后硬刷新頁面,因此模板:

<form method='POST' id='pass-form'>
    {% csrf_token %}
    <div class="mb-3">
        <label for="exampleInputEmail1" class="form-label">Email address</label>
        <input type="email" class="form-control" name="InputEmail" required>
        <div id="emailHelp" class="form-text">We'll never share your email with anyone else.</div>
    </div>
    
    <button type="submit" class="btn btn-primary">Generate Password</button><br><br>
    </form>
    
    <div class="mb-3">
        <label for="exampleInputPassword1" class="form-label">Generated Password</label>
        <input type="text" id="InputPassword" name = "genpassword" value ={{gen}} >
    </div>
<script type='text/javascript'>
    let form =  document.getElementById('pass-form');
    addEventListener('submit', (event) => {
        location.reload(true); // hard refreshed
        console.log('hard refreshed')
    });

</script>

注意:然后還有某些瀏覽器,如 Microsoft Edge,會彈出 他們在其中提到您正在查找的頁面使用了您輸入的信息。 返回頁面可能會觸發您在那里執行的任何操作的重復。 你要繼續嗎?

當你點擊繼續時,它會創建重復的記錄,所以我認為正如文檔提到的第一種方法更好。

暫無
暫無

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

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