Django: действие формы шаблона не перенаправляет - PullRequest
1 голос
/ 19 октября 2019

Мое Form действие не перенаправляет на переданный view. Я вызываю simple_upload метод представления из login_form.html действия формы. Вместо этого, после нажатия кнопки входа, она остается на той же странице. Ниже мой код:

urls.py:

from django.conf.urls import url
from django.contrib import admin
from django.conf import settings
from django.conf.urls.static import static
from uploads.core import views

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^', views.login_form, name='login_form'),
    url(r'^upload/', views.simple_upload, name='simple_upload'),
    url(r'^drop_down/$', views.drop_down, name='drop_down'),
    url(r'^visualize_view/$', views.visualize_view, name='visualize_view'),
]

urlpatterns += static(settings.MEDIA_URL, document_root=settings.AKASH_ROOT)

login_form.html:


{% block content %}

<button onclick="document.getElementById('id01').style.display='block'" style="width:auto;">Login</button>

<div id="id01" class="modal">

  <form class="modal-content animate" action="{% url 'simple_upload' %}" method="get">
    {% csrf_token %}
    <div class="imgcontainer">
      <span class="close" title="Close Modal">&times;</span>
      <img src="https://www.w3schools.com/howto/img_avatar2.png" alt="Avatar" class="avatar">
    </div>

    <div class="container">
      <label for="uname"><b>Username</b></label>
      <input type="text" placeholder="Enter Username" name="uname" required>

      <label for="psw"><b>Password</b></label>
      <input type="password" placeholder="Enter Password" name="psw" required>

      <button type="submit">Login</button>
      <label>
        <input type="checkbox" checked="checked" name="remember"> Remember me
      </label>
    </div>

    <div class="container" style="background-color:#f1f1f1">
      <button type="button" class="cancelbtn">Cancel</button>
      <span class="psw">Forgot <a href="">password?</a></span>
    </div>
  </form>
</div>

<script>
// Get the modal
var modal = document.getElementById('id01');

// When the user clicks anywhere outside of the modal, close it
window.onclick = function(event) {
    if (event.target == modal) {
        modal.style.display = "none";
    }
}
</script>
{% endblock %}

views.py:

from django.http import HttpResponse
from django.shortcuts import render, redirect
from django.core.files.storage import FileSystemStorage
from .models import Document
from .forms import ExpenseForm

def login_form(request):
    return render(request, 'core/login_form.html')


def simple_upload(request):
    return HttpResponse("Hello World")

Иерархия проектов:

Project Hierarchy

Ответы [ 2 ]

1 голос
/ 20 октября 2019

Это не очень хорошая логика. Формы имеют действительные и недействительные действия. Если ваша форма действительна, вы перенаправляете на новую (успешную) страницу вашего пользователя, но если нет, вы отображаете ту же (логин) страницу. Но сначала вы должны дать имя своей странице входа в систему, как показано ниже, или использовать наследуемые аутентификационные URL-адреса Django:

url(r'^login', views.login_form, name='login_form'),

Это мои URL-адреса:

from django.contrib import admin
from django.urls import path, include
from . import views

app_name = "user"

urlpatterns = [
    path('sign_up/', views.sign_up, name="sign_up"),
    path('account_activation_sent/', views.account_activation_sent, name='account_activation_sent'),
    path('activate/<uidb64>/<token>/', views.activate, name="activate"),
    path('login/', views.login_user, name="login"),
    path('logout/', views.logout_user, name="logout"),

    path('password_reset/', views.password_reset, name="password_reset"),
    path('password_reset/done/', views.password_reset_done, name="password_reset_done"),
    path('password_reset/<uidb64>/<token>/', views.password_reset_confirm, name="password_reset_confirm"),
    path('password_reset/complete/', views.password_reset_complete, name="password_reset_complete"),


    path('profile/<slug:slug>/', views.profile, name="profile"),
]

Я хочу показать вам мою простую функцию входа в системуи вы поймете:

def login_user(request):
    if request.user.is_authenticated:
        return redirect("index")
    else:
        form = LoginForm(request.POST or None)
        context = {
            "form": form
        }
        go_to = request.POST.get('next', '/')  
        print(go_to)
        if form.is_valid():
            username = form.cleaned_data.get("username")
            password = form.cleaned_data.get("password")
            user = authenticate(username=username, password=password)

            if user is None:
                messages.error(request, "Username or password is incorrect! Try again.")
                return render(request, "auths/login.html", context)

            messages.success(request, "Login successful! Welcome bro.")
            login(request, user)
            go_to = request.POST.get('next', '/')
            if go_to:
                go_to = request.POST.get(
                    'next')
                return redirect(go_to)
            else:
                return redirect("index")
        return render(request, "auths/login.html", context)

Я использую форму Django, и это легко, но вы можете использовать свою собственную форму в своем шаблоне. Моя форма выглядит так:

class LoginForm(forms.Form):
    username = forms.CharField(label="Username")
    password = forms.CharField(label="Password", widget=forms.PasswordInput)

    def __init__(self, *args, **kwargs):
        super(LoginForm, self).__init__(*args, **kwargs)
        self.fields['username'].label = ''
        self.fields['password'].label = ''

    class Meta:
        model = User
        fields = ('username', 'password' )

Надеюсь, это поможет вам.

1 голос
/ 19 октября 2019

Шаблон вашего домашнего URL не прекращен, поэтому он соответствует каждому пути. Должно быть:

url(r'^$', views.login_form, name='login_form'),
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...