Search code examples
djangodjango-formsdjango-login

Login through dropdown menu in Django


I have struggle with django's login. So i want user to login through my dropdown menu, but my LoginForm doesnt show up. I dunno what to do

forms.py

class LoginForm(forms.Form):
    username = forms.CharField(label=(u'Username'),widget = forms.TextInput(attrs = {'placeholder': 'Username'}))
    password = forms.CharField(max_length=16, label=(u'Password'), 
    widget = forms.PasswordInput(attrs = {'placeholder': 'Password (min 8 chrct)'}, render_value = False),
    validators=[MinLengthValidator(8, message = 'Password must be at least 8 characters')])

views.py

def LoginRequest(request):
if request.user.is_authenticated():
    return HttpResponseRedirect('/profile/')
if request.method == 'POST':
    form = LoginForm(request.POST)
    if form.is_valid():
        username = form.cleaned_data['username']
        password = form.cleaned_data['password']
        tutor = authenticate(username=username, password=password)
        if tutor is not None:
            login(request, tutor)
            return HttpResponseRedirect('/profile/')
        else:
            return render_to_response('/', {'form': form}, context_instance=RequestContext(request))
    else:
        return render_to_response('/', {'form': form}, context_instance=RequestContext(request))
else:
    form = LoginForm()
    context = {'form': form}
    return render_to_response('/', {'form': form}, context_instance=RequestContext(request))

navbar.html

<a class="dropdown-toggle" href="#" data-toggle="dropdown">Login <strong class="caret"></strong></a>
        <div class="dropdown-menu" style="padding: 15px; padding-bottom: 0px;">
            <form action="" method="POST">
            {% csrf_token %}
                {% if form.errors %}
                    {{ form.errors}}
                {% endif %}
               {{form}}
                <input class="btn btn-primary" type="submit" value="Login" />

            </form>
        </div>

Solution

  • It looks like your issue is not with Django but with your bootstrap drop down.

    Wrap your drop down html in a <div class="dropdown">.

    <div class="dropdown">
    
        <a class="dropdown-toggle" href="#" data-toggle="dropdown">Login <strong class="caret"></strong></a>
    
        <div class="dropdown-menu" style="padding: 15px; padding-bottom: 0px;">
            <form action="" method="POST">
                {% csrf_token %}
                {% if form.errors %}
                    {{ form.errors }}
                {% endif %}
                {{ form }}
                <input class="btn btn-primary" type="submit" value="Login"/>
    
            </form>
        </div>
    
    </div>