Как сохранить данные в базе данных из выпадающего списка в Djngo

Вот мой код

Я работаю над проектом управления студентами и не могу получить филиал для студента, так как он является foreignkey модели курса к модели студента, и я хочу получить выбранный вариант в модели студента в строке филиала

models.py

class Course(models.Model):
    id=models.AutoField(primary_key=True)
    course = models.CharField(max_length=50)
    course_code = models.BigIntegerField(null=True)
    
    def __str__(self):
        return self.course

class Student(models.Model):
    id=models.AutoField(primary_key=True)
    user=models.OneToOneField(User,on_delete=models.CASCADE)
 
 
 
 branch=models.ForeignKey(Course,on_delete=models.CASCADE,null=True,blank=True)
    middle_name=models.CharField(max_length=50,null=True)
    roll_no=models.IntegerField()
    mobile_no=PhoneNumberField(default='')
    parents_mobile_no=PhoneNumberField(default='')
    division=models.CharField(max_length=10,null=True)
    batch=models.CharField(max_length=10,null=True)
    
    def __str__(self):
        return self.user.first_name + " " + self.user.last_name

views.py

def studentregister(request):
    if request.method == 'POST':
        first_name = request.POST['first_name']
        middle_name = request.POST['middle_name']
        last_name = request.POST['last_name']
        email = request.POST['email']
        branch= request.POST['branch']
        division = request.POST['division']       
        roll_no = request.POST['roll_no']
        mobile_no = request.POST['mobile_no']
        parents_mobile_no = request.POST['parents_mobile_no']
        pass1 = request.POST['password']
        pass2 = request.POST['confirmpassword']
        
        if pass1 == pass2 :
            if User.objects.filter(email=email).exists():
                return HttpResponse('User already exsits')
            else:
                user = User.objects.create_user(email=email, password=pass1, first_name=first_name, last_name=last_name)
                user.save();
                studentdetails = Student ( user=user, middle_name=middle_name,roll_no=roll_no,mobile_no=mobile_no,parents_mobile_no=parents_mobile_no, branch=branch,division=division)
                studentdetails.save();
                return render (request, 'ms/homepage/index.html')
        else:
            return HttpResponse('password does not match')
    else:
        return HttpResponse('failed')

def staffstudent(request):
    if request.user.is_authenticated and request.user.user_type==3:
        courses = Course.objects.all()
        return render(request, 'ms/staff/student.html',{'courses':courses})
    else:
        return render(request,'ms/login/login.html')

html файл как student.py

<form action="studentregister" method="POST" style = "background-color:#011B3C;">
            {% csrf_token %}
<div class="form-group" name="branch">
            <select >
                <option selected disabled="true">Branch</option>
                {% for course in courses%}
                <option>{{course.course}}</option>
                {%endfor%}
            </select>
            </div> 
</form>

Ошибка, которую я получаю, заключается в следующем MultiValueDictKeyError at /staff/studentregister 'branch'

Пожалуйста, помогите мне с этим как можно скорее

Вы не назвали этот <select> (<select name="branch">), поэтому любой выбор, который вы сделаете в нем, не будет передан на сервер, и поэтому вы получаете ошибку ключа.

Кроме того, значение <option> должно быть идентификатором курса:

<option value="{{ course.id }}">{{ course.course }}</option>

... чтобы вы могли посмотреть его в представлении:

branch = Course.objects.get(id=request.POST['branch'])

Однако, пожалуйста посмотрите на встроенную функциональность форм в Django, особенно формы моделей - вы сделаете это за долю кода HTML и Python, который у вас есть сейчас, плюс у вас будет правильная валидация данных.

Это не совсем обычный способ работы с формами в Django, хотя это можно сделать. Традиционным было бы:

создание формы в forms.py выглядит так:

class MyForm(forms.Form):

dropdown_one = forms.ChoiceField(
    label="Country",
    widget=forms.Select(attrs={"class": "selecter form-control"}),
    choices=[],
)
dropdown_two = forms.ChoiceField(
    label="Category",
    widget=forms.Select(attrs={"class": "selecter form-control"}),
    choices=[(None, '...')],
    required=True

)

затем используйте эту форму в файле views.py следующим образом:

my_form = MyForm(initial={})
return render(request,{'my_form':my_form})

затем, наконец, в html файле :

        {{my_form.media}}
        {% for item in my_form %}
        <div class="form-group col-lg-2" id="dropdown-content">
          {{item.label_tag}}
          {{item}}
        </div>
        {% endfor %}  
      </div>

Надеюсь, это поможет. За дополнительной информацией обращайтесь сюда: https://docs.djangoproject.com/en/4.0/topics/forms/

Вернуться на верх