اذهب إلى المحتوى

السؤال

نشر (معدل)

عند تنفيذ الكود يظهر الخطأ في المتصفح

UnboundLocalError at /accounts/login/

local variable 'form' referenced before assignment

يظهر الخطأ في الشيفرة التالية:

كود html:

  <form method="POST" enctype="multipart/form-data">
            <h4 class="auth-header"> Login</h4>
            {% crsf_token %}
     
            <div class="form-group">
                {{form.username|as_crispy_field}}
            </div>
            
            <div class="form-group">
                {{form.password|as_crispy_field }}
                       </div>

url:

     path('login/', views.user_login, name='login'),

forms:

from django import forms
from django.contrib.auth.models import User


class Login_Form(forms.ModelForm):
    username=forms.CharField()
    password=forms.CharField(widget=forms.PasswordInput())
    class Meta:
        model = User
        fields = ('username', 'password')

 

تم التعديل في بواسطة Wael Aljamal
توضيح السؤال

Recommended Posts

  • 0
نشر
بتاريخ 10 دقائق مضت قال Haroun Taha:

أرفقي شيفرة دالة user_login في ملف views.py 

from django.shortcuts import render
from django.contrib.auth.models import User
from .models import Profile
from .forms import Login_Form
from django.contrib.auth import authenticate , login
from django.contrib.auth.decorators import login_required

    
def doctors_detail(request, slug):
    doctors_detail = Profile.objects.get(slug = slug)
    return render(request, 'user/doctors_detail.html',{
        'doctors_detail' : doctors_detail,
    })

def user_login(request):
    if request.method == 'POST':
        form = Login_Form()
        username = request.POST['username']
        password = request.POST['password']
        user = authenticate(request , username=username , password=password)
        if user is not None:
            login(request , user)
            return redirect('accounts:doctors_list')
        else:
              form = Login_Form()
    return render(request, 'user/login.html',{
        'form':form
    })

 

  • 0
نشر
بتاريخ 12 دقائق مضت قال Zeina Makdisi:

from django.shortcuts import render
from django.contrib.auth.models import User
from .models import Profile
from .forms import Login_Form
from django.contrib.auth import authenticate , login
from django.contrib.auth.decorators import login_required

    
def doctors_detail(request, slug):
    doctors_detail = Profile.objects.get(slug = slug)
    return render(request, 'user/doctors_detail.html',{
        'doctors_detail' : doctors_detail,
    })

def user_login(request):
    if request.method == 'POST':
        form = Login_Form()
        username = request.POST['username']
        password = request.POST['password']
        user = authenticate(request , username=username , password=password)
        if user is not None:
            login(request , user)
            return redirect('accounts:doctors_list')
        else:
              form = Login_Form()
    return render(request, 'user/login.html',{
        'form':form
    })

 

المُتغير form لا يُعرف بسبب أنه فقط يتم تعريفه داخل الطلب اذا كان من نوع POST يُعرف لذلك يجب وضع الelse بشكل يوازي ... if request.method == 'POST :

def user_login(request):
    if request.method == 'POST':
        form = Login_Form()
        username = request.POST['username']
        password = request.POST['password']
        user = authenticate(request , username=username , password=password)
        if user is not None:
            login(request , user)
            return redirect('accounts:doctors_list')
 >> else:# هنا
      	form = Login_Form()
    return render(request, 'user/login.html',{
        'form':form
    })

 

  • 0
نشر
بتاريخ 2 ساعات قال Zeina Makdisi:

if request.method == 'POST':

لاحظي هذا الشرط، أن لن يتم تنفيذ ما بداخل الدالة مالم يكن نوع الطلب POST وفيها تعريف المتغير form 

بالتالي في حال كان نوع الطلبية غير POST سيتم تخطي الشرط و جزء تعريف المتغير form و عمل return مباشرة مع قيمة فارغة فيه

الحل لتجنب الخطأ هو إعطاء قيمة أولية للمتغير form قبل الشرط، أو إسناد القيمة في عبارة else بعد الشرط قبل عمل return

مع التأكد أن استمارة إرسال البيانات نوعها method = post

def user_login(request):
  form = Login_Form()               # هنا
  if request.method == 'POST':
    #..
  else:                             # هنا أو 
    form = Login_Form()
    return render(request, 'user/login.html',{
      'form':form
    })

ملاحظة: عبارة else في برنامجك موجودة  لكنها ليست بنفس محاذاة تعليمة if مما سبب الخطأ

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...