I have created a custom user model in Django and am trying to create a login form. Instead of the form showing up in the Django template, login_form, the name of the variable, shows up.
forms.py
class ProfileLogin(forms.ModelForm):
password = forms.CharField(label="Password", widget=forms.PasswordInput)
class Meta:
model = Profile
fields = ("username", "password")
def clean(self):
username = self.cleaned_data.get('username', None)
password = self.cleaned_data.get('password', None)
if not authenticate(username=username, password=password):
raise forms.ValidationError("Invalid username and/or password.")
return None
views.py
def login_views(request):
context = {}
user = request.user
if user.is_authenticated:
return redirect('index')
if request.POST:
login_form = ProfileLogin(request.POST)
if login_form.is_valid():
username = request.POST['username']
password = request.POST['password']
user = authenticate(username=username, password=password)
if user:
login(request, user)
return redirect('index')
else:
login_form = ProfileLogin()
context['login_form'] = ['login_form']
return render(request, "capstone/login.html", context)
html
<form method="post">
{% csrf_token %}
{% for field in login_form %}
<h5>{{ field.label_tag }}
{{ field }}
{% if field.help_text %}
<span>{{ field.help_text }}</span>
{% endif %}
{% for error in field.errors %}
<p>{{ error }}</p>
{% endfor %}
{% if login_form.non_field_errors %}
<div>{{ login_form.non_field_errors }}</div>
{% endif %}
</h5>
{% endfor %}
<button type="submit">Login</button>
</form>
I tried changing
{% for field in login_form %}
<h5>{{ field.label_tag }}
{{ field }}
to {{ login_form }}
, but the same thing happens. The name login_form shows up on the webpage instead of the actual form.
CodePudding user response:
You need to modify your view to add the form to the context, you currently passing in a single string in a list.
context['login_form'] = ['login_form']
Needs to be:
context['login_form'] = login_form