Как взять данные из HTML Inputs и использовать их в форме?
Я пытаюсь получить логин и пароль пользователя из HTML-шаблона (из ) и использовать эти входные данные для обработки. Я хочу использовать входные данные из HTML-шаблона, а не обычные формы Django, такие как:
<label class="form-label">Username</label>
{{ form.username }}
<span>{{ form.errors.username }}</span>
Это часть HTML-шаблона:
<form method="post">
{% csrf_token %}
<div class="mb-[22px]">
<input type="username" placeholder="Username"
class="w-full px-5 py-3 text-base transition bg-transparent border rounded-md outline-none border-stroke dark:border-dark-3 text-body-color dark:text-dark-6 placeholder:text-dark-6 focus:border-primary dark:focus:border-primary focus-visible:shadow-none"
/>
</div>
<div class="mb-[22px]">
<input type="password" placeholder="Password"
class="w-full px-5 py-3 text-base transition bg-transparent border rounded-md outline-none border-stroke dark:border-dark-3 text-body-color dark:text-dark-6 placeholder:text-dark-6 focus:border-primary dark:focus:border-primary focus-visible:shadow-none"
/>
</div>
Это класс из файла forms.py:
from django.contrib.auth.models import User
from django.contrib.auth.forms import UserCreationForm, AuthenticationForm
from django.forms import CharField, TextInput, EmailField, EmailInput, PasswordInput
from users.validators import validate_email
class RegisterForm(UserCreationForm):
username = CharField(
max_length=50,
min_length=3,
required=True,
widget=TextInput(attrs={"class": "form-control"}),
)
email = EmailField(
max_length=320,
validators=[validate_email],
required=True,
widget=EmailInput(attrs={"class": "form-control"}),
)
password1 = CharField(
required=True,
widget=PasswordInput(attrs={"class": "form-control"}),
)
password2 = CharField(
required=True,
widget=PasswordInput(attrs={"class": "form-control"}),
)
class Meta:
model = User
fields = ("username", "email", "password1", "password2")
class LoginForm(AuthenticationForm):
username = CharField(
max_length=50,
min_length=3,
required=True,
widget=TextInput(attrs={"class": "form-control"}),
)
password = CharField(
required=True,
widget=PasswordInput(attrs={"class": "form-control"}),
)
class Meta:
model = User
fields = ("username", "password")
Как правильно сопрягать эти элементы кода?
Думаю, вам просто не хватает FormView
. Следующий пример делает некоторые предположения о том, что вы собираетесь делать с формой. Например, я прочитал ваше утверждение "и не обычные формы Django", чтобы сказать, что вы хотите больше контроля, и поэтому предложенный ниже пример включает регистрацию пользователя. В том виде, в котором написан мой пример, он конкурирует с вашим LoginForm
, поскольку вы наследуете от AuthenticationForm
, который также выполняет вход в систему в своем методе clean()
. Учитывая это, пожалуйста, не забывайте корректировать этот пример в соответствии с вашими реальными потребностями.
from django.contrib.auth import authenticate, login
from django.views.generic.edit import FormView
from django.urls import reverse_lazy
from .forms import LoginForm
class LoginView(FormView):
form_class = LoginForm
template_name = 'login.html' # replace with your login template
success_url = reverse_lazy('home') # replace with your success url
def form_valid(self, form):
username = form.cleaned_data.get('username')
password = form.cleaned_data.get('password')
user = authenticate(username=username, password=password)
if user is not None:
login(self.request, user)
return super().form_valid(form)
form.add_error(None, "Invalid username or password")
return super().form_invalid(form)